2013-11-04 82 views
1

我試圖設置變量,其名稱是在存儲過程中動態:SQL:動態變量名

DECLARE @var01 varchar(50) 
DECLARE @var02 varchar(50) 
... 
DECLARE @var30 varchar(50) 
DECLARE @sql = varchar(max) 

DECLARE @loopcnter INT  

-- (Inside some loop where the loopcounter increments each iteration) 
... 
SET @sql = 'SET @var0'+CAST(@loopcntr AS Varchar)+'= '''+'somevalue'+'''' 
-- e.g.) SET @var01= 'somevale' 
EXEC (@sql) 

這並不工作,因爲變量聲明在不同範圍的動態SQL 。

以這種方式動態設置變量的正確方法是什麼?

+0

你爲什麼需要名稱是動態的?你試圖解決的更大的問題是什麼? –

+0

你想達到什麼目的?事實上,動態SQL有它自己的範圍 – jazzytomato

+0

您是否嘗試過使用'@@'變量? – Kermit

回答

3

嗯,這是不漂亮,但你可以這樣做:

if @loopcntr = 1 
    set var01 = 'somevalue' 
else if @loopcntr = 2 
    set var02 = 'whatever' 
else if . . . 

這應該是足夠的不愉快,你可能會認爲替代品。哦,這是一個很好的。定義一個表變量,只是添加行中的每個值:

declare @vars table (
    id int identity(1, 1), 
    loopcntr int, 
    value varchar(255) 
); 

. . . 
-- inside the loop 
    insert into @vars(loopcntr, value) 
     select @loopcntr, 'whatever'; 

如果你想獲得一個變量,你可以這樣做:

declare @var varchar(255); 
select @var = value from @vars where loopcntr = <the one I want>; 
+0

+1 _「這應該是非常不愉快的,你可能會想到替代品。」_ –

0

您還可以使用存儲過程sp_executesql允許傳遞參數。雖然 我建議使用額外的表來存儲變量。

0

由於您在評論中指出只分配一組變量來將指定的值插入表中,您可以使用一種方法來完全避免變量。您可以將所有值插入到臨時表或表變量中,爲它們提供數字索引,然後對值列進行旋轉並將結果行插入到目標表中。所以,這樣的事情:

DECLARE @values TABLE (Ind int IDENTITY(1,1), Value varchar(50)); 

INSERT INTO @values 
SELECT ... 
; 

INSERT INTO TargetTable (Col1, Col2, ..., Col30) 
SELECT [1], [2], ..., [30] 
FROM @values 
PIVOT (
    MAX(Value) FOR Ind IN ([1], [2], ..., [30]) 
) AS p 
;

我甚至懷疑有也可能以這樣的方式,以避免您的評論都在提光標做的一切的可能性。