2014-01-25 54 views
4

我有n個數@BLOCn變量。一個while循環中的SQL連接變量

是否可以連接變量名稱,以便可以使用循環計數器作爲它的一部分?例如:

DECLARE @BLOC1 int, @i int, @MAX int, @QTY int; 

SET @i = 1; 
SET @MAX = 1; 
SET @BLOC1 = 12; 

WHILE @i <= @MAX 
BEGIN 
    SET @QTY = FLOOR('BLOC'[email protected]) 
    ... 
END 

SELECT @QTY 

到目前爲止,我得到這個錯誤:

Conversion failed when converting the varchar value 'BLOC' to data type int.

基本上,我在尋找SQL相當於JavaScript的的:

var foo = 'var'; 
var bar = 'Name'; 
window[foo + bar] = 'hello'; 
alert(varName); 
+3

你只能做到這一點使用動態SQL。 –

+0

@GordonLinoff我在上面添加了一些細節。我怎麼能實現使用動態SQL? – greener

+1

而不是讓'n'變量具有'n'行的表變量。你究竟在做什麼?您顯示的重複分配給「@ QTY」的代碼並且從不使用任務沒有多大意義。 –

回答

3

你將無法做你所問的方式。 SQL Server具有可運行動態SQL的exec()函數和sp_executesql存儲過程。但是,它們都爲運行該命令創建了另一個上下文。

如果你願意使用表變量來保存你的@BLOC值,你可以做這樣的事情:

DECLARE @BLOCS table(k int, v int); 
DECLARE @i int, @MAX int, @QTY int; 

SET @i = 1; 
SET @MAX = 1; 

insert into @BLOCS values(1, 12) 

WHILE @i <= @MAX 
BEGIN 
    SET @QTY = FLOOR((select v from @BLOCS where k = @i)) 
    set @i = @i + 1 
END 

SELECT @QTY 
+1

完全天才。非常感謝! – greener

-1

正如戈登·利諾夫說你可以用動態SQL做到這一點:

這是概念。這是相當完整的代碼,但您顯然需要按照您的要求進行調整。我做的是如何動態SQL工作:

一個簡單的例子聲明一個變量來存儲您的SQL它:

DECLARE @sql as varchar(max) 

然後你所要做的就是創建一個SQL語句,但像這樣的字符串。這會給你動態創建的所有領域:

declare @sqlcounter as int 
declare @listofvariables as varchar(500) 
set @sqlcounter =1 

while sqlCounter <= 12 
BEGIN 
set @listofvariables = @listofvariables + 'BLOC' + @SqlCounter +', ' 
set @sqlCounter = @sqlCounter + 1 
END 

set @sql = 'select ' + @listofvariables + ' FROM tablename' 

EXEC @SQL 

現在明白這並不意味着是一個完整的解決方案,而是如何動態SQL作品的解釋和如何將其應用到您的問題。

在這種情況下,SQL現在將是:

SELECT BLOC1, BLOC2, BLOC3, BLOC4, BLOC5, BLOC6, BLOC7, BLOC8, BLOC9, BLOC10, BLOC11, BLOC12 FROM tablename 

希望這有助於!