1. 程式人生 > >Sql Server 2008中儲存過程傳入表值引數

Sql Server 2008中儲存過程傳入表值引數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

SQL Server 2008中SQL應用系列--目錄索引


經常我們會遇到需要一次往資料表中插入多行資料。此時,最簡單的莫過於呼叫儲存過程。

比如目標表如下:

USE testDb2GO
IF NOT OBJECT_ID('tb_Demo_MultiRowsInsert') IS NULLDROP TABLE [tb_Demo_MultiRowsInsert]/****** Object: Table [dbo].[tb_Demo_MultiRowsInsert] Script Date: 2012/4/6 12:19:21 ******/CREATE TABLE [dbo].[tb_Demo_MultiRowsInsert]([TeamID] int not null primary key identity(101,1),[PName] [Nvarchar](20) NOT NULL,[GName] [Nvarchar
](20) NOT NULL)GO


呼叫儲存過程插入一個行集

/*************一次插入一個行集******************//********* [email protected] 邀月***************/Create Procedure CPP_InsertOneRows(@PName Nvarchar(20)='',@GName Nvarchar(20)='')asINSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)VALUES(@PName,@GName)GO


如果需要多行,則迴圈呼叫儲存過程即可。這樣做的壞處是顯而易見的。於是有了改進方案:

/*************一次插入五個行集******************//********* [email protected] 邀月***************/Create Procedure CPP_InsertFiveRows(@PName1 Nvarchar(20)='',@GName1 Nvarchar(20)='',@PName2 Nvarchar(20)='',@GName2 Nvarchar(20)='',@PName3 Nvarchar(20)='',@GName3 Nvarchar(20)='',@PName4 Nvarchar(20)='',@GName4 Nvarchar(20)='',@PName5 Nvarchar(20)='',@GName5 Nvarchar(20)='')asINSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)VALUES(@PName1,@GName1)INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)VALUES(@PName2,@GName2)INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)VALUES(@PName3,@GName3)INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)VALUES(@PName4,@GName4)INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)VALUES(@PName5,@GName5)GO


這樣,一次可以插入五條資料,當然十條,也可以。但明顯也有不足,首先,如果剛好要插入3條資料,那麼應該避免null值和允許插入等異常。

幸運的是,SQL Server 2008提供了新的表值引數,可以一次性傳入並處理多個行集。

示例如下:

/*************一次插入N個行集******************//********* [email protected] 邀月***************/----首先,我們定義一個表值引數型別,其實就是一個表變數Create type dbo.tp_Demo_MultiRowsInsert as Table([PName] [Nvarchar](20) NOT NULL,[GName] [Nvarchar](20) NOT NULL)GO----下面我們用這個表變數做引數,通過儲存過程呼叫它CREATE Procedure dbo.CPP_InsertMultiRows(@ManyRows as tp_Demo_MultiRowsInsert readonly)asINSERT [dbo].[tb_Demo_MultiRowsInsert]SELECT PName,GName from @ManyRowsGO----程式中構造多個行集DECLARE @tmpRows as tp_Demo_MultiRowsInsert----插入多個數據到引數表中INSERT @tmpRows(PName,GName) values('胡一刀','國土資源部')INSERT @tmpRows(PName,GName) values('胡青牛','醫藥局')INSERT @tmpRows(PName,GName) values('令狐沖','文廣中心')----傳遞引數到儲存過程,完成一次多行集插入EXEC dbo.CPP_InsertMultiRows @tmpRows

  注意:這種一次轉入多個引數的模式與SQL Servrer 2008新增的Values((group1),(group2),...,(groupn))的方式很類似,後者的應用可以看這裡:

http://blog.csdn.net/downmoon/article/details/5936706

  小結:SQL Server 2008 新增引數型別-表值引數,使用使用者定義的表型別來宣告,藉助它,可以不必建立臨時表或許多引數,即可向儲存過程傳送多行資料。對於某些繁忙的系統,這減少了應用程式和資料庫伺服器之間的互動,從而減少了佔用的頻寬,資料庫端的事務處理更高效。


邀月注:本文版權由邀月和CSDN共同所有,轉載請註明出處。
助人等於自助!   [email protected]




           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述