這裏是你如何可以用表值參數做到這一點。這些都是在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,並帶有外鍵關係。我會以此爲例作爲答案。 –