最近工作中寫了幾個存儲過程,需要向存儲過程中傳遞字符串,因為SQL Server 2000中沒有內置類似于 split 的函數,只好自己處理,將前臺數據集中的一列用逗號拆分存到一個List<string>中,再轉化為字符串傳給存儲過程,很是麻煩。今天看了下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。 
二、測試概述 
測試項目很簡單,就是添加新用戶 
 
 
三、準備數據 
1、建立數據庫、表、類型、存儲過程 
復制代碼 代碼如下:www.CuoXIn.com
 
IF NOT EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID('Users') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) 
BEGIN 
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(UserID) 
) 
END 
IF NOT EXISTS(SELECT * FROM sys.table_types WHERE name = 'UserTable' AND is_user_defined = 1) 
BEGIN 
CREATE TYPE UserTable AS TABLE 
( 
UserName VARCHAR(20) NOT NULL, 
UserPass VARCHAR(20) NOT NULL, 
Sex BIT NULL, 
Age SMALLINT NULL 
) 
END 
GO 
 
復制代碼 代碼如下:www.CuoXIn.com
 
IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID('sp_InsertSingleUser') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) 
BEGIN 
DROP PROCEDURE dbo.sp_InsertSingleUser 
END 
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 
SET XACT_ABORT OFF 
GO 
 
前臺搭建好表單,后臺主要是一個函數: 
復制代碼 代碼如下:www.CuoXIn.com
 
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); 
10 
DataSet ds = new DataSet(); 
SqlDataAdapter da = new SqlDataAdapter(cmd); 
da.Fill(ds); 
} 
catch (Exception ex) 
{ 
throw ex; 
} 
} 
 
點擊【添加】按鈕時調用存儲過程。測試是完成了