Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 UPDATE с фильтрацией  [new]
NewBie77
Member

Откуда:
Сообщений: 184
Доброго времени суток. Имею процедуру где хочу обновить таблицу с фильтрацией. Тоесть если передам параметр пустым или NULL то оно не обновит параметр и оставит прежним
Таблица :

 ID    FirstName   Status
  1       A            NULL
  2       C            NULL


Процедура :

@id int,
@first_name varchar(20),
@status tinyint

UPDATE myTbl
 SET FirstName = ISNULL(nullif(@first_name,''), FirstName) , Status = ISNULL(nullif(@status,''), Status)
 WHERE @id = ID


Процедуру вызываю следующим образом :

EXEC myProc 1,'Alex','' 
, когда хочу обновить статус обновляется любым числом кроме 0 , если передаю статус 0 то он не обновляет а остается прежний параметр. При любых числах кроме нуля обновляется без проблем. Не могли бы подсказать почему ?
30 окт 13, 13:13    [15052148]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с фильтрацией  [new]
Гость333
Member

Откуда:
Сообщений: 3683
NewBie77,

Потому что cast('' as tinyint) = 0, из чего следует, что nullif(0,'') = NULL.
30 окт 13, 13:18    [15052191]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с фильтрацией  [new]
NewBie77
Member

Откуда:
Сообщений: 184
Гость333,
Не могли бы помочь правильно написать логику ? Чтоб и с нулем тоже работало
30 окт 13, 13:22    [15052228]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с фильтрацией  [new]
Гость333
Member

Откуда:
Сообщений: 3683
NewBie77,

SET ... Status = ISNULL(@status, Status)

Если придёт @status=NULL, то ISNULL(@status, Status) будет равно Status, значение в таблице не изменится.

Если придёт @status <> NULL, то ISNULL(@status, Status) будет равно @status, значение в таблице изменится на @status.
30 окт 13, 13:31    [15052305]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с фильтрацией  [new]
NewBie77
Member

Откуда:
Сообщений: 184
Гость333
NewBie77,

SET ... Status = ISNULL(@status, Status)

Если придёт @status=NULL, то ISNULL(@status, Status) будет равно Status, значение в таблице не изменится.

Если придёт @status <> NULL, то ISNULL(@status, Status) будет равно @status, значение в таблице изменится на @status.

Что будет в том случае если придет пустой ? @status = '' . Я заменил tinyint на char теперь все работает просто очень интересно как будет при случае с tinyint
30 окт 13, 13:34    [15052330]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с фильтрацией  [new]
Гость333
Member

Откуда:
Сообщений: 3683
NewBie77
Что будет в том случае если придет пустой ? @status = ''

Поле или переменная с типом данных tinyint не может принимать значение "пустая строка". Это же числовой тип данных, он допускает целочисленные значения от 0 до 255, плюс значение NULL.
При присвоении значения "пустая строка" происходит неявная конвертация в числовое значение 0:
declare @a tinyint;
set @a = ''; -- пустая строка неявно преобразуется в число 0
select @a; -- будет выведено значение 0, а не пустая строка
30 окт 13, 13:40    [15052371]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с фильтрацией  [new]
NewBie77
Member

Откуда:
Сообщений: 184
Гость333
NewBie77
Что будет в том случае если придет пустой ? @status = ''

Поле или переменная с типом данных tinyint не может принимать значение "пустая строка". Это же числовой тип данных, он допускает целочисленные значения от 0 до 255, плюс значение NULL.
При присвоении значения "пустая строка" происходит неявная конвертация в числовое значение 0:
declare @a tinyint;
set @a = ''; -- пустая строка неявно преобразуется в число 0
select @a; -- будет выведено значение 0, а не пустая строка

спасибо
30 окт 13, 13:53    [15052466]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить