經常我們會遇到需要一次往數據表中插入多行數據。此時,最簡單的莫過於調用存儲過程。
比如目標表如下:
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 新增參數類型-表值參數。使用用戶定義的表類型來聲明,借助它,可以不必創建臨時表或許多參數,即可向存儲過程發送多行數據。對於某些繁忙的系統,這減少了應用程序和數據庫服務器之間的交互,從而減少了占用的帶寬,數據庫端的事務處理更高效。