我有一个可以正常工作的游标但是当它到达脚本的这一部分时,它似乎仍然运行更新,即使该表不存在:
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变量也正确传入。
答案 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次(可能更多)这种代码是设计不佳的症状。