有条件地遍历列

问题描述

我目前正在尝试遍历标题为“ Switch 1,Switch 2,....”的38列,以便根据条件进行更新。

这是我的代码

DECLARE @i int
DECLARE @selec nvarchar(max)

SET @i  = 1

WHILE @ i <= 38
    BEGIN
        SET @selec = 'UPDATE 'Catalog v4'' + '
        SET   'Switch' + LTRIM(STR(@i+1)) = ' + CASE
        WHEN ( 'Switch' + LTRIM(STR(@i+1))= [Switch Check String] ) THEN ( '' )
        ELSE ( 'Switch' + LTRIM(STR(@i+1))) 
        SET @i = @i+1
        EXEC(@selec)
     END 

我不断收到错误消息

必须声明标量变量@,配方附近的语法不正确

非常感谢您的帮助!

解决方法

WHILE @ i <= 38

应该是:

 WHILE @i <= 38
,

假设您尝试更新表[目录4],以下操作可能会有所帮助:

DECLARE @i int
DECLARE @selec nvarchar(max)

SET @i  = 1

WHILE @i <= 38
    BEGIN
        SET @selec = 'UPDATE '+QUOTENAME('Catalog v4')+'
        SET   '+QUOTENAME('Switch ' + LTRIM(STR(@i+1)))+' =  CASE
        WHEN ('+QUOTENAME('Switch '+ LTRIM(STR(@i+1)))+' = ''[Switch Check String]'' ) THEN ( '''' )
        ELSE ('+QUOTENAME('Switch ' + LTRIM(STR(@i+1)))+') END'
        
        PRINT @selec    --please check the printed messages before executing those.

        SET @i = @i+1
        --EXEC(@selec)
     END
  • Quotename有助于正确定义对象名称(如果其中包含空格)。
  • 请相应地替换[Switch check string]。
,

下面的代码创建一个模板语句,然后每次通过循环对其进行更新,而不是尝试每次都从零开始进行汇编。

declare @SQLTemplate as VarChar(256) =
  'update [Catalog V4] set Switch# = '' where Switch# = [Switch Check String];'
declare @SQL as VarChar(256);
declare @Index as Int = 1;

while @Index <= 38
  begin
  set @SQL = Replace( @SQLTemplate,'#',Cast( @Index as VarChar(3) ) );
  execute ( @SQL );
  set @Index += 1;
  end

请注意,update语句已得到简化,以避免每次通过时都更新每一行,而不管值是否实际更改。

,

另一种方法(需要全面测试)是使用Information.Schema.Columns视图而不是循环。

    declare @select varchar(4000) = ''

    select  
    @select = @select 
    + 'update YourTableName set ' + COLUMN_NAME + ' = ' + ' CASE WHEN ' + COLUMN_NAME 
    + ' = ''[Switch Check String]'' THEN '''' ELSE ' + COLUMN_NAME + 'END ; '
    
    FROM 

    INFORMATION_SCHEMA.COLUMNS 
    where 
    TABLE_NAME = 'YourTableName' 
    and COLUMN_NAME like 'YourCondition'
    
    print @select
    --exec @select