Sql server 使用条件遍历列

Sql server 使用条件遍历列,sql-server,tsql,Sql Server,Tsql,我目前正在尝试遍历38列标题为“开关1,开关2,…”,以便根据条件更新它们 这是我的密码: 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 ( 'S

我目前正在尝试遍历38列标题为“开关1,开关2,…”,以便根据条件更新它们

这是我的密码:

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 
DECLARE@i int
声明@selec nvarchar(最大值)
设置@i=1

当@i
而@i假设您正在尝试更新表[Catalog 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
DECLARE@i int
声明@selec nvarchar(最大值)
设置@i=1

而@i下面的代码创建了一个模板语句,然后通过循环每次更新它,而不是每次都试图从“n”个比特组装它

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
将@SQLTemplate声明为VarChar(256)=
'更新[Catalog V4]设置开关#=''其中开关#=[开关检查字符串];'
将@SQL声明为VarChar(256);
将@Index声明为Int=1;
而@Index另一种方法(需要彻底测试)是使用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

具有重复组的表几乎总是数据库设计不佳的标志。将这些表规范化为第一个标准形式几乎总是使它们更易于使用。您需要打印@selec并观察它的错误。您已经构建了一个SQL语句,但其中有一个语法错误。我想我应该澄清一下,这是一个数据操作软件,允许您使用SQL生成自定义宏。其目的不是用这些信息创建数据库,而是为了处理。@TroyE219不知道数据处理软件是什么意思。但要调试动态sql,您必须看到您试图执行的内容。您所拥有的内容充满了tsql语法错误,因此不清楚您正在做什么,也不清楚您是如何做的。请注意,“Switch 1”与“Switch 1”不同——您的代码在编写前者时生成后者。带有空格的列名需要特殊处理。错误是因为@i时,
中的@和i之间有空格
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
    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