如果SQL Server游标中的EXISTS不起作用

时间:2011-08-31 18:11:16

标签: sql sql-server if-statement cursor

我有一个可以正常工作的游标但是当它到达脚本的这一部分时,它似乎仍然运行更新,即使该表不存在:

 SET @sql = 'IF (EXISTS (SELECT * FROM ps_vars_' + @datasetid + '))
             BEGIN
     UPDATE ps_vars_' + @datasetid + '
     SET    programming_notes = replace(programming_notes, ''Some of the variables listed are source variables.'')
         END';

  EXEC SP_EXECUTESQL @sql   

我错过了什么? #datasetid变量也正确传入。

2 个答案:

答案 0 :(得分:2)

DECLARE @tablename sysname 

SET @tablename = 'ps_vars' + @datasetid

IF (OBJECT_ID(@tablename, 'U') IS NOT NULL)
BEGIN
 SET @sql = ' UPDATE ' + QUOTENAME(@tablename) + '
     SET    programming_notes = replace(programming_notes, ''Some of the variables listed are source variables.'') ';
     EXEC sp_executesql @sql  
END

答案 1 :(得分:1)

当您使用带有表名的EXISTS来查看表是否存在时,您实际上是在尝试访问该表 - 这是不存在的。这就是您收到错误的原因,而不是因为您的UPDATE声明。

请改为尝试:

SET @sql = 'IF (OBJECT_ID(''ps_vars_' + @datasetid + ''') IS NOT NULL)
    BEGIN
        UPDATE ...
    END'

然后考虑一下您的数据库设计可能出现什么问题,这需要您像这样使用动态SQL。也许你的设计确实是它需要的,但根据我的经验,10次中有9次(可能更多)这种代码是设计不佳的症状。