ЕСЛИ СУЩЕСТВУЕТ в SQL Server курсор не работает - PullRequest
0 голосов
/ 31 августа 2011

У меня есть курсор, который отлично работает, но когда он добирается до этой части скрипта, он все равно запускает обновление, даже если таблица не существует:

 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 ]

2 голосов
/ 31 августа 2011
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 голос
/ 31 августа 2011

Когда вы используете EXISTS с именем таблицы, чтобы увидеть, существует ли таблица, вы на самом деле пытаетесь получить доступ к таблице - которой нет. Вот почему вы получаете ошибку, а не из-за вашего заявления UPDATE.

Попробуйте вместо этого:

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

Тогда подумайте, что может быть не так с вашей базой данных, которая требует от вас использования динамического SQL, подобного этому. Возможно, ваш дизайн именно такой, каким он должен быть, но, по моему опыту, 9 из 10 раз (возможно, намного больше) такого рода код является признаком плохого дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...