我想做以下程序
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
的代码时,它运行正常并且无限循环(因为它永远不会完成)。所以我认为问题在于集合。
答案 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