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