如何解决有条件地遍历列
我目前正在尝试遍历标题为“ 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。