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


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

 

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

比如目標表如下:

USE testDb2
GO

IF NOT OBJECT_ID('tb_Demo_MultiRowsInsert') IS NULL
DROP 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

 

調用存儲過程插入一個行集

/*************一次插入一個行集******************/
/********* 3w@live.cn 邀月***************/
Create Procedure CPP_InsertOneRows
(@PName Nvarchar(20)='',
@GName Nvarchar(20)=''
)
as
INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)
VALUES(@PName,@GName)
GO

 

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

/*************一次插入五個行集******************/
/********* 3w@live.cn 邀月***************/
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)=''
)
as

INSERT [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個行集******************/
/********* 3w@live.cn 邀月***************/

----首先,我們定義一個表值參數類型,其實就是一個表變量
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
)
as
INSERT [dbo].[tb_Demo_MultiRowsInsert]
SELECT PName,GName from @ManyRows

GO

----程序中構造多個行集
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://www.cnblogs.com/downmoon/archive/2010/10/12/1849176.html

 

小結:SQL Server 2008 新增參數類型-表值參數。使用用戶定義的表類型來聲明,借助它,可以不必創建臨時表或許多參數,即可向存儲過程發送多行數據。對於某些繁忙的系統,這減少了應用程序和數據庫服務器之間的交互,從而減少了占用的帶寬,數據庫端的事務處理更高效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM