SQL在while循环中连接变量

时间:2014-01-25 00:13:27

标签: sql sql-server-2008 tsql

我有{em> n 个@BLOCn个变量。

是否可以连接变量名,以便可以使用循环计数器作为其中的一部分?例如:

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'+@i)
   ...
END

SELECT @QTY

到目前为止,我收到了这个错误:

  

将varchar值'BLOC'转换为数据时转换失败   输入int。

我基本上是在寻找Javascript的SQL等价物:

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

2 个答案:

答案 0 :(得分:3)

你无法按照自己的方式去做。 SQL Server具有exec()函数和sp_executesql存储过程,可以运行动态SQL。但是,它们都会为运行命令创建另一个上下文。

如果您愿意使用表格变量来保存@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 :(得分:-1)

正如Gordon Linoff所说,你可以用动态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

希望这有帮助!