Id Name Name1
1 John Bob
2 Steve John
TableName- AllColumnUpdate
此脚本不起作用。
declare @col_name varchar(max)
,@sql nvarchar(max)
DECLARE Curupdate CURSOR FOR
SELECT column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME =
'AllColumnUpdate' and ordinal_position > 1
OPEN Curupdate
FETCH NEXT FROM Curupdate INTO @col_name
WHILE @@FETCH_STATUS = 0
BEGIN
select case when @col_name = 'John' then 1 else 0 end from AllColumnUpdate
FETCH NEXT FROM Curupdate INTO @col_name
END
CLOSE Curupdate
DEALLOCATE Curupdate
但这是可行的
declare @col_name varchar(max)
,@sql nvarchar(max)
DECLARE Curupdate CURSOR FOR
SELECT column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME =
'AllColumnUpdate' and ordinal_position > 1
OPEN Curupdate
FETCH NEXT FROM Curupdate INTO @col_name
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql = 'select case when '+@col_name+' = ''John'' then 1 else 0 end from
AllColumnUpdate'
EXEC (@sql)
FETCH NEXT FROM Curupdate INTO @col_name
END
CLOSE Curupdate
DEALLOCATE Curupdate
简单的case语句在Cursor中不起作用,但是带有动态查询的case在游标中可以正常工作...可能是什么原因?
答案 0 :(得分:0)
在工作(动态)脚本中,您正在对列执行查询。
在无效脚本中,您正在针对列的名称执行查询。
更具体地说:
在工作脚本中,第一次迭代生成的查询为:
select case when Name = 'John' then 1 else 0 end
在无效脚本中,第一次迭代的查询是:
select case when 'Name' = 'John' then 1 else 0 end
第二条SELECT语句的条件始终为false,因此将始终返回0,这就是您得到的结果。