Выполнение операторов if и else - PullRequest
4 голосов
/ 02 июня 2011

У меня есть этот запрос в моем sql

if (select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS')) = 4
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0    --old version
else 
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0, 1 --new version

Результат select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS') равен 4, однако всегда выполняется версия запроса с параметром else.

Что я делаю не так с моим утверждением if?

UPDATE:

Кажется, он запускает оба отчета, потому что если я сделаю

if (select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS')) = 5
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0, 1 --new version
else 
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0    --old version

Я получаю ту же ошибку, но теперь он говорит, что делает первое утверждение.

UPDATE2: Микаэль Эрикссон получил правильный ответ, я изменил свой код на этот, чтобы исправить это.

if ((select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS')) = 5)
    execute ('insert into CLIENT_STATUS select ''NA'', ''Inactive'', 0, 0, 1') --new version
else
    execute ('insert into CLIENT_STATUS select ''NA'', ''Inactive'', 0, 0')    --old version

Ответы [ 3 ]

6 голосов
/ 02 июня 2011

Вы получаете ошибку, когда SQL Server компилирует ваши операторы.

С этой таблицей

create table TestTable(ID int)

Попробуйте выполнить этот оператор

if 1 = 1
  insert into TestTable values (1)
else
  insert into TestTable values(1, 2)  

Результат:

Msg 213, Level 16, State 1, Line 4
Column name or number of supplied values does not match table definition.

Очевидно, что второй оператор никогда не будет выполнен, но он будет скомпилирован.

0 голосов
/ 22 августа 2018

Я возвращаюсь к старому вопросу, но у меня просто возникла проблема, когда я не хотел компилировать инструкцию ELSE, если она никогда не достигает его, и обнаружил, что приведенный выше совет по динамическому SQL больше не работает.Я обнаружил, что, используя команду GOTO, я мог избежать компиляции инструкции ELSE, если она не требуется.Вот пример:

IF (1 = 1) 
    GOTO SUCCESS;
ELSE GOTO ERROR;

ERROR:
    PRINT 'Oh no, an error'
    SELECT 1 + 'A'
SUCCESS:
    PRINT 'Yay no errors'

Это никогда не приведет к ошибке, так как ветвь ERROR: никогда не будет скомпилирована.

Имейте в виду, что если вы не хотите прерывать выполнение приошибка, как я сделал, вам придется снова использовать GOTO, чтобы пропустить ветку SUCCESS :.Например:

IF (1 <> 1) 
    GOTO SUCCESS;
ELSE GOTO ERROR;

ERROR:
    PRINT 'Oh no, an error'
    GOTO FINAL
SUCCESS:
    PRINT 'Yay no errors'
FINAL:
    PRINT 'Oh well'

Возвращает:

Oh no, an error
Oh well
0 голосов
/ 02 июня 2011

Я полагаю, что это связано с вашей круглой скобкой, вы закрываете свое утверждение if, а затем сравниваете его с 5.

Вы можете попробовать это для отладки:

declare @myCount as int
select @myCount = select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS';
print @myCount

if (@myCount = 5)
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0, 1 --new version
else 
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0    --old version

Это поможет вам обеспечить ценность, которую вы получаете от выбора.

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