Sql2008中使用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。

  二、測試概述

  測試項目很簡單,就是添加新用戶

  

  三、準備數據

  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的未來版本中能夠繼續增強對錶變量和臨時表的支持,尤其是早日支持臨時表調試。

發佈了49 篇原創文章 · 獲贊 5 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章