SQL Server 2008中使用DataTable作为存储过程的参数的相关知识是本文我们主要要介绍的内容,笔者在最近工作中写了几个存储过程,需要向存储过程中传递字符串,因为SQL Server 2000中没有内置类似于split 的函数,只好自己处理,将前台数据集中的一列用逗号拆分存到一个List中,再转化为字符串传给存储过程,很是麻烦。今天看了下SQL Server 2008的新特性,发现有表变量的使用,及其将DataTable作为参数的用法,就尝试了一下,简单谈谈心得。
一、测试环境
1、Windows Server 2008 R2 DataCenter
2、Visual Studio 2008 Team System With SP1
3、SQL Server 2008 Enterprise Edition With SP1
由于是SQL Server 2008新特性,所以只能用2008。
二、测试概述
测试项目很简单,就是添加新用户
class='fit-image' onload='javascript:if(this.width>498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="SQL Server 2008中使用DataTable作为存储过程的参数" src="http://images.51cto.com/files/uploadimg/20110901/1321580.jpg" />
三、准备数据
建立数据库、表、类型、存储过程
代码:
- IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Users]') AND type in (N'U'))
- DROP TABLE [dbo].[Users]
- CREATE TABLE [dbo].[Users](
- [UserID] [int] IDENTITY(-1,-1) NOT NULL,
- [UserName] [varchar](20) NOT NULL,
- [UserPass] [varchar](20) NOT NULL,
- [Sex] [bit] NULL,
- [Age] [smallint] NULL,
- CONSTRAINT [PK_Users_UserID] PRIMARY KEY CLUSTERED
- (
- [UserID] ASC
- )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
- ) ON [PRIMARY]
- IF EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N'UserTable' AND ss.name = N'dbo')
- DROP TYPE [dbo].[UserTable]
- CREATE TYPE [dbo].[UserTable] AS TABLE(
- [UserName] [varchar](20) NOT NULL,
- [UserPass] [varchar](20) NOT NULL,
- [Sex] [bit] NULL,
- [Age] [smallint] NULL
- )
- IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_InsertSingleUser]') AND type in (N'P', N'PC'))
- DROP PROCEDURE [dbo].[sp_InsertSingleUser]
- GO
- CREATE PROCEDURE [dbo].[sp_InsertSingleUser]
- (
- @User UserTable READONLY
- )
- AS
- SET XACT_ABORT ON
- BEGIN TRANSACTION
- INSERT INTO dbo.Users(UserName, UserPass, Sex, Age)
- SELECT UserName, UserPass, Sex, Age FROM @User
- COMMIT TRANSACTION
- 前台搭建好表单,后台主要是一个函数:
- 代码
- public void fnInsertSingleUser(DataTable v_dt)
- {
- try
- {
- SqlConnection cn = new SqlConnection(CONN);
- SqlCommand cmd = cn.CreateCommand();
- cmd.CommandType = CommandType.StoredProcedure;
- cmd.CommandText = @"sp_InsertSingleUser";
- SqlParameter p = cmd.Parameters.AddWithValue("@User", v_dt);
- DataSet ds = new DataSet();
- SqlDataAdapter da = new SqlDataAdapter(cmd);
- da.Fill(ds);
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
点击【添加】按钮时调用存储过程。测试是完成了,也很简单,传递一个DataTable做参数确实很方便吧,能够轻松完成原先需要很多编码的工 作。关于表变量还是有些道道的,如创建时判断其是否存在的语句,删除表变量前需要先删除引用表变量的存储过程等。
一般开发我大多会选择用临时表,处理起来 比较方便,表变量可以作为存储过程参数确实是一个独特的优势,希望在SQL Server的未来版本中能够继续增强对表变量和临时表的支持,尤其是早日支持临时表调试。
关于SQL Server 2008数据库中使用DataTable作为存储过程的参数的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!