Оператор UPDATE, заключенный в блок IF EXISTS - PullRequest
5 голосов
/ 06 апреля 2010

Я пытаюсь написать сценарий DML, который обновляет столбец, но я хотел убедиться, что столбец существует первым, поэтому я поместил его в блок IF EXISTS

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN
    UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21
END

Таким образом, странность заключается в том, что он пытается выполнить обновление, даже если не выполняется условие. Таким образом, столбец не существует, выполняется инструкция UPDATE, и я получаю сообщение об ошибке. Почему?

Даже странно, что это работает:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN
    EXEC('UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21')
END

Есть ли в команде UPDATE что-то особенное, что заставляет ее так себя вести?

Ответы [ 2 ]

6 голосов
/ 06 апреля 2010

Проблема в том, что скрипт будет скомпилирован / проанализирован, и если столбец не существует, у вас будет ошибка компиляции / синтаксического анализа.

Неверное имя столбца 'IsClarityEnabled'.

2 голосов
/ 06 апреля 2010

пытается выполнить обновление, даже если не выполняется условие

Ты уверен? Я подозреваю, что на самом деле происходит то, что SQL Server пытается проанализировать UPDATE, независимо от значения условия. Поскольку синтаксический анализ выполняется перед выполнением, SQL Server не может «знать», что вы защитили этот UPDATE с помощью проверки - анализатор знает только, что в Client нет столбца IsClarityEnabled, и поэтому жалуется.

Причина, по которой EXEC работает так, как вам нужно, заключается в том, что строковый литерал не обрабатывается парсером. Это стандартный способ иметь сценарии, которые должны работать со схемой, которая не известна до времени выполнения.

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