简单的case语句不适用于Cursor,但是带有游标中的动态查询的Case在起作用。

时间:2019-02-14 17:19:30

标签: sql sql-server tsql

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在游标中可以正常工作...可能是什么原因?

1 个答案:

答案 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,这就是您得到的结果。