while循环中的SQL连接变量

while循环中的SQL连接变量,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有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 正如Gordon Linoff所说,您可以使用动态SQ

我有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

正如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 Server有一个
exec()
函数和一个可以运行动态SQL的
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
DECLARE@BLOCS表(k int,v int);
声明@i int、@MAX int、@QTY int;
设置@i=1;
设置@MAX=1;
插入@BLOCS值(1,12)

而@i您只能使用动态SQL来实现它。@GordonLinoff我在上面添加了一些细节。我如何使用动态SQL实现这一点呢?与其使用
n
变量,不如使用
n
行的表变量。你到底想做什么?您反复显示的分配给
@QTY
且从未使用分配的代码没有多大意义。@MartinSmith上面的代码是我问题的一个简单示例。在编辑之后,您实际想做什么?你需要这个做什么?你问的是如何在不告诉我们什么是问题的情况下实施你提出的解决方案。SQL中没有与JS构造直接等价的东西。
SELECT BLOC1, BLOC2, BLOC3, BLOC4, BLOC5, BLOC6, BLOC7, BLOC8, BLOC9, BLOC10, BLOC11, BLOC12 FROM tablename
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