0

我需要提供一個解決方案,通過多種參數在SQL Server中的一系列報告存儲過程的問題,2008年的參數將是用戶偏好和可以由其中用戶已選擇多於一個類型的列表價值(例如多個月)。可能有多達30個不同的參數,其中60%會包含多個選項。將偏好類型參數傳遞給存儲過程 - 最佳實踐?

到目前爲止,我有3個選項。

  1. 傳中值與一組接口正常參數 - 這似乎是相當快的,我需要通過集合(多個月份會是一個很好的例子)失敗。

  2. 通行證中的參數爲單個XML片段。儘管我不確定它是否可以處理相同類型的多個元素(例如上面的幾個月),但此方法已在此處使用。該代碼使用DynaFilter來解析XML - 我從來沒有聽說過它,並且在互聯網上找不到任何參考。編寫代碼的開發人員明天會回來,所以我會有更多信息。

  3. 使用表值參數 - 我纔剛剛開始看這些,但他們看好,似乎提供了良好的性能。

我們使用SQL Server 2008和ASP.Net MVC前端。如有需要,我們可以移至2012年。

我已經開始,並會繼續做更多的研究來解決這個問題的最好辦法,但都重視的最佳方式任何意見前,如果有任何可用的其他選項。

在此先感謝。

+1

看看這裏的答案 - 它同樣適用於大量的參數。我建議使用表值參數,我已經使用它們,它們非常快。 http://stackoverflow.com/questions/43249/t-sql-stored-procedure-that-accepts-multiple-id-values –

+0

謝謝桑德拉。這是一個很好的閱讀,我會更多地消化它。如果我使用表值的參數,我可以嵌套它們嗎?所以我有一個表值的參數,有列表類型的值表巴巴姆?一個列表的集合? – bhs

+0

bhs - 不幸的是,沒有。對[用戶定義的表類型](http://technet.microsoft.com/en-us/library/bb522526(v = sql.105).aspx)的限制之一是它們不能用作另一列中的列用戶定義的表格類型。但是,您可以將兩個TVP傳遞給您的sproc,並帶有外鍵關係。我會以此爲例作爲答案。 –

回答

0

這裏是你如何可以用表值參數做到這一點。這些都是在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基於集合的操作。

相關問題