循环中的SQL动态列

时间:2014-08-11 15:21:42

标签: sql sql-server-2008 loops dynamic dynamic-columns

我想做以下程序

declare @a as varchar(10)
set @a= '1'
declare @sql as varchar(1000)
--select @sql ='select convert(float,'+@a+')+1' 
declare @b as varchar(20)
set @b = '5'


select @sql= 'while ('+@a+'<=4)
begin
select ['+@a+'] from #Seg1PD_TruncadaFinal where truncada ='+@a+'
set '+@a+'='+@a+'+1 
end'
exec(@sql)  

我有一个表6x5,其中5列名称是1,2,3,4,5,另一个是“Truncada”,有5行:1,2,3,4,5。我想选择第1列,例如第1行,然后选择其他组合,所以我尝试了。问题是当我想要更改@a的值时,可能是因为它是一个varchar,但这不是while中条件的问题。

抱歉,我不是很清楚,这是我收到的错误:

Msg 102, Level 15, State 1, Line 1574 Incorrect syntax near '1'.

但是,当我编写没有de set '+@a+'='+@a+'+1的代码时,它运行正常并且无限循环(因为它永远不会完成)。所以我认为问题在于集合。

1 个答案:

答案 0 :(得分:3)

您获得无限循环的原因是因为您的查询错误 - 当您运行WHILE循环时,您声明的变量和(您认为)编辑的变量实际上不再是变量。通过将它们连接到包含WHILE子句的SQL语句,您可以插入它们的值:您只需反复运行相同的数据。使用PRINT(@SQL),您可以看到您的实际查询是:

while (1<=4) -- this will always be mathematically true
begin
select [1] from #Seg1PD_TruncadaFinal where truncada =1
set 1=1+1 -- this doesn't actually do anything
end

我认为,无论出于何种原因,您都会尝试执行以下操作:

declare @a as varchar(10)
set @a= '1'
declare @sql as varchar(1000)
--select @sql ='select convert(float,'+@a+')+1' 
declare @b as varchar(20)
set @b = '5'

while (@a<=4)
  begin
    select @sql= '
        select ['+@a+'] from #Seg1PD_TruncadaFinal where truncada ='+@a
    exec(@sql)  
    set @a=@a+1 
  end