最近工作中寫了幾個存儲過程,需要向存 儲過程中傳遞字符串,因為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。
二、測試概述
測試項目很簡單,就是添加新用戶

三、準備數據
1、建立數據庫、表、類型、存儲過程
代碼
1?IF?NOT?EXISTS(SELECT?*?FROM?dbo.sysobjects?WHERE?id?=?OBJECT_ID('Users')?AND?OBJECTPROPERTY(id,?N'IsUserTable')?=?1) 2?BEGIN 3?CREATE?TABLE?dbo.Users 4?( 5?UserID?INT?IDENTITY(-1,?-1)?NOT?NULL, 6?UserName?VARCHAR(20)?NOT?NULL, 7?UserPass?VARCHAR(20)?NOT?NULL, 8?Sex?BIT?NULL, 9?Age?SMALLINT?NULL, 10?CONSTRAINT?PK_Users_UserID?PRIMARY?KEY(UserID) 11?) 12?END 13?IF?NOT?EXISTS(SELECT?*?FROM?sys.table_types?WHERE?name?=?'UserTable'?AND?is_user_defined?=?1) 14?BEGIN 15?CREATE?TYPE?UserTable?AS?TABLE 16?( 17?UserName?VARCHAR(20)?NOT?NULL, 18?UserPass?VARCHAR(20)?NOT?NULL, 19?Sex?BIT?NULL, 20?Age?SMALLINT?NULL 21?) 22?END 23?GO 24 代碼 1?IF?EXISTS(SELECT?*?FROM?dbo.sysobjects?WHERE?id?=?OBJECT_ID('sp_InsertSingleUser')?AND?OBJECTPROPERTY(id,?N'IsProcedure')?=?1) 2?BEGIN 3?DROP?PROCEDURE?dbo.sp_InsertSingleUser 4?END 5?GO 6?CREATE?PROCEDURE?dbo.sp_InsertSingleUser 7?( 8?@User?UserTable?READONLY 9?) 10?AS 11 12?SET?XACT_ABORT?ON 13?BEGIN?TRANSACTION 14 15?INSERT?INTO?dbo.Users(UserName,?UserPass,?Sex,?Age) 16?SELECT?UserName,?UserPass,?Sex,?Age?FROM?@User 17 18?COMMIT?TRANSACTION 19?SET?XACT_ABORT?OFF 20?GO |
前臺搭建好表單,后臺主要是一個函數:
代碼
1?public?void?fnInsertSingleUser(DataTable?v_dt) 2?{ 3?try 4?{ 5?SqlConnection?cn?=?new?SqlConnection(CONN); 6?SqlCommand?cmd?=?cn.CreateCommand(); 7?cmd.CommandType?=?CommandType.StoredProcedure; 8?cmd.CommandText?=?@"sp_InsertSingleUser"; 9?SqlParameter?p?=?cmd.Parameters.AddWithValue("@User",?v_dt); 10 11?DataSet?ds?=?new?DataSet(); 12?SqlDataAdapter?da?=?new?SqlDataAdapter(cmd); 13?da.Fill(ds); 14?} 15?catch?(Exception?ex) 16?{ 17?throw?ex; 18?} 19?} |
點擊【添加】按鈕時調用存儲過程。測試是完成了,也很簡單,傳遞一個DataTable做參數確實很方便吧,能夠輕松完成原先需要很多編碼的工作。關于 表變量還是有些道道的,如創建時判斷其是否存在的語句,刪除表變量前需要先刪除引用表變量的存儲過程等。一般開發我大多會選擇用臨時表,處理起來比較方 便,表變量可以作為存儲過程參數確實是一個獨特的優勢,希望在SQL Server的未來版本中能夠繼續增強對表變量和臨時表的支持,尤其是早日支持臨時表調試。