这里是你如何可以用表值参数做到这一点。这些都是在SQL 2008中引入的,所以如果你选择走这条路线的话,那么这个版本对你的解决方案来说就没问题。在这个测试场景中,我制作了一个主表和一个外键指向主表的相关表。
首先,创建表的数据类型:
CREATE TYPE primary_tbltype AS TABLE
(personkey int NOT NULL PRIMARY KEY,
firstname varchar(30),
lastname varchar(30))
CREATE TYPE related_tbltype AS TABLE
(fk_personkey int NOT NULL,
accountnum varchar(30),
accountbalance money)
创建存储过程:
CREATE PROCEDURE MySproc
@PrimaryTable primary_tbltype READONLY,
@RelatedTable related_tbltype READONLY
AS
BEGIN
DECLARE @CurrentKey INT
DECLARE @FirstName VARCHAR(30)
DECLARE @LastName VARCHAR(30)
DECLARE @AccountTotal MONEY
DECLARE PersonCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT personkey, firstname, lastname FROM @PrimaryTable
OPEN PersonCursor
FETCH NEXT FROM PersonCursor INTO @CurrentKey, @FirstName, @LastName
WHILE @@FETCH_STATUS= 0 BEGIN
SELECT @AccountTotal = SUM(accountbalance) FROM @RelatedTable
WHERE fk_personkey = @CurrentKey
PRINT @FirstName + ' ' + @LastName + ' - account total: ' + CONVERT(VARCHAR(30), @AccountTotal)
FETCH NEXT FROM PersonCursor INTO @CurrentKey, @FirstName, @LastName
END
END;
下面是一些测试数据来尝试一下:
DECLARE @primaryTVP primary_tbltype
DECLARE @relatedTVP related_tbltype
INSERT INTO @primaryTVP values (1, 'John', 'Cleese')
INSERT INTO @primaryTVP values (2, 'Eric', 'Idle')
INSERT INTO @primaryTVP values (3, 'Graham', 'Chapman')
INSERT INTO @relatedTVP values (1, '29310918', 28934.33)
INSERT INTO @relatedTVP values (2, '123123', 3418.11)
INSERT INTO @relatedTVP values (2, '33333', 666.66)
INSERT INTO @relatedTVP values (3, '554433', 22.22)
INSERT INTO @relatedTVP values (3, '239482', 151515.15)
EXEC MySproc @primaryTVP, @relatedTVP;
一些使用TVPs的优势涵盖了here,他们也能够参与g基于集合的操作。
看看这里的答案 - 它同样适用于大量的参数。我建议使用表值参数,我已经使用它们,它们非常快。 http://stackoverflow.com/questions/43249/t-sql-stored-procedure-that-accepts-multiple-id-values –
谢谢桑德拉。这是一个很好的阅读,我会更多地消化它。如果我使用表值的参数,我可以嵌套它们吗?所以我有一个表值的参数,有列表类型的值表巴巴姆?一个列表的集合? – bhs
bhs - 不幸的是,没有。对[用户定义的表类型](http://technet.microsoft.com/en-us/library/bb522526(v = sql.105).aspx)的限制之一是它们不能用作另一列中的列用户定义的表格类型。但是,您可以将两个TVP传递给您的sproc,并带有外键关系。我会以此为例作为答案。 –