【问题标题】:SQL Dynamic Column in a loop循环中的 SQL 动态列
【发布时间】:2014-10-04 11:42:40
【问题描述】:

我想做下面的程序

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 的情况下编写代码时,它可以在无限循环中运行(因为它永远不会完成)。所以我认为问题出在集合中。

【问题讨论】:

  • 你的问题是什么?您是否收到错误消息,是否收到您不期望的结果,您的计算机是否起火...
  • 作为调试动态 SQL 的一般提示,在 exec 之前放置一个测试 print,例如 print @sql

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


【解决方案1】:

你得到一个无限循环的原因是你的查询是错误的——当你运行 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2020-09-09
    • 2013-12-26
    • 2018-10-07
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多