我有{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);
答案 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
希望这有帮助!