Переменная Int при установке на ноль ведет себя странно

#sql-server #tsql

#sql-server #tsql

Вопрос:

У меня есть следующий код, и когда я ожидал, что он не попадет в блок if, он попал. Унаследованный код, поэтому я предпочитаю игнорировать оригинальную идею программистов о смешивании типов данных — поэтому я очень стараюсь отложить в сторону вопрос о качестве кода.

 Declare @computedValue int
set @computedValue = 0

if(@computedValue = '')
Begin
    select 'its empty'
End
  

Почему это выводит «его пустой», когда я устанавливаю значение @computedValue равным нулю, которое явно не является «?

Странно то, что если я установлю для нее какое-то число, отличное от нуля, оно не войдет в if .

Фактическое назначение @computedValue :

 select @computedValue = case when Block_Value is null or Block_Value = '' then null else Block_Value end
  

Комментарии:

1. Рекомендуемое чтение: приоритет типа данных .

2. @DaleK Да, я делаю. Последний абзац преобразования символьных данных начинается со слов: «Когда пустая строка преобразуется в an int , ее значение становится 0 » . (Хорошо, это заняло менее пяти минут кражи, но теперь я знаю, где это официально заявлено.)

Ответ №1:

Потому что select convert(int, '') возвращает 0 — это одно из многих автоматических преобразований типов, выполняемых SQL Server. Вот как вы можете справиться с вашей ситуацией:

 declare @Block_Value varchar(12) = '';

declare @computedValue int;
set @computedValue = 0;

-- select @computedValue = case when Block_Value is null or Block_Value = '' then null else Block_Value end
select @computedValue = nullif(@Block_Value,'');

if @computedValue is null
begin
    select 'its empty';
end;
  

Кроме того, приоритет типа данных объясняет, почему пустая строка преобразуется в an int в вашем сравнении (а не наоборот).