SQL Server 2008中使用DataTable作為存儲過程的參數(shù)
SQL Server 2008中使用DataTable作為存儲過程的參數(shù)的相關(guān)知識是本文我們主要要介紹的內(nèi)容,筆者在最近工作中寫了幾個存儲過程,需要向存儲過程中傳遞字符串,因為SQL Server 2000中沒有內(nèi)置類似于split 的函數(shù),只好自己處理,將前臺數(shù)據(jù)集中的一列用逗號拆分存到一個List中,再轉(zhuǎn)化為字符串傳給存儲過程,很是麻煩。今天看了下SQL Server 2008的新特性,發(fā)現(xiàn)有表變量的使用,及其將DataTable作為參數(shù)的用法,就嘗試了一下,簡單談?wù)勑牡谩?/p>
一、測試環(huán)境
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。
二、測試概述
測試項目很簡單,就是添加新用戶
三、準(zhǔn)備數(shù)據(jù)
建立數(shù)據(jù)庫、表、類型、存儲過程
代碼:
- 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
- 前臺搭建好表單,后臺主要是一個函數(shù):
- 代碼
- 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;
- }
- }
點擊【添加】按鈕時調(diào)用存儲過程。測試是完成了,也很簡單,傳遞一個DataTable做參數(shù)確實很方便吧,能夠輕松完成原先需要很多編碼的工 作。關(guān)于表變量還是有些道道的,如創(chuàng)建時判斷其是否存在的語句,刪除表變量前需要先刪除引用表變量的存儲過程等。
一般開發(fā)我大多會選擇用臨時表,處理起來 比較方便,表變量可以作為存儲過程參數(shù)確實是一個獨特的優(yōu)勢,希望在SQL Server的未來版本中能夠繼續(xù)增強(qiáng)對表變量和臨時表的支持,尤其是早日支持臨時表調(diào)試。
關(guān)于SQL Server 2008數(shù)據(jù)庫中使用DataTable作為存儲過程的參數(shù)的相關(guān)知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】


2010-07-15 12:38:14
2009-08-06 16:44:06




