0

我想做以下程序

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,但这不是当时条件的问题。

对不起,我不是很清楚,这是我收到的错误:

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

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

4

1 回答 1

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
于 2014-08-11T15:36:34.267 回答