2012-05-03 27 views
1

我有一個過程,接受多個varchar(4000)參數(其中26)。Concat參數名稱循環params

他們每個人都是一個逗號分隔的值的字符串。

一旦它們被傳入,我想將每個字符串分開並將它們插入臨時表中以供稍後在proc中使用。

我寧願不寫一個單獨處理每個參數的語句,而是編寫一個while循環,它依靠計數器循環遍歷每個參數並依次處理每個參數。目前,我嘗試了以下,但它不正確。

CREATE PROCEDURE [dbo].[myproc] (
    @string1 varchar(4000) = null; 
    @string2 varchar(4000) = null; 
    @string3 varchar(4000) = null; 
    ....declare @string4 -> @string25... 
    @string26 varchar(4000) = null;) 

CREATE TABLE #emails (
    address varchar(80) 
    ) 

Set @counter = 1 

WHILE @counter < 27 
BEGIN 
INSERT INTO #emails(address) SELECT element as address from FT_SPLIT_LIST(isNull('@string'+convert(varchar,@counter),''),',') 
SET @counter = @counter +1 
END 

SELECT * FROM #emails 

目前,這並未返回包含@ string1 - > @ string26中所有CSV的表格。

FT_SPLIT_LIST的作品 - 我在很多其他地方使用它。我只需要知道是否有一種方法來動態聲明正在傳遞給它的參數?

有沒有什麼辦法可以做,而不用爲每個@ string1 - > @ string27參數編寫語句來完成我想要完成的任務?

謝謝, Ç

+0

您使用的是哪個版本的SQL Server? – Oded

+0

我正在使用2008 R2 – csza

+0

你有什麼_loading_這些參數?這幾乎可以肯定這是做到這一點的「錯誤」方式。 @ Oded的答案看起來應該是好的;如果這不起作用,你可以通過'LOAD'(我想,也許是'IMPORT'?)將數據加載到臨時表中,然後從那裏進行一次批量更新。 –

回答

2

SQL Server 2008和上述具有table valued parameters

表值參數是通過使用用戶定義的表類型聲明。您可以使用表值參數將多行數據發送到Transact-SQL語句或例程(如存儲過程或函數),而無需創建臨時表或多個參數。

這些是比逗號分隔的變量和FT_SPLIT_LIST更好的選項。

我建議您閱讀Erland Sommarskog的Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters,以獲取關於此主題的全面討論。

+0

Oded,謝謝你的迴應。我一定會查看你發佈的鏈接。 – csza

+0

+1我來這裏發佈關於TVPs的...絕對是循環使用CSV的首選方法.... – Matthew