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

Откуда:
Сообщений: 41
Есть хп с двумя параметрами, один (@personid int) обязательный, второй (@peroncode bit = null) нет.
хп сохраняет или апдейтит значение в поле peroncode (bit может быть null)

в процессе работы хп выполняется несколько раз:
usp_savepersoncode 1256;
usp_savepersoncode 1256, 1;
usp_savepersoncode 1256, 0;
usp_savepersoncode 1256, null; -- здесь проблема 

т.к. @peroncode по умолчанию у нас null и мы делаем проверку:
peroncode = ISNULL([SOURCE].peroncode,[TARGET].peroncode) 

не получается записать значение null, остаётся 0 или 1.

Подскажите, пожалуста, как можно это решить.

SQLServer 2008R2
ALTER PROCEDURE usp_savepersoncode
  @personid int,  
  @peroncode bit = null
AS
BEGIN
     SET NOCOUNT ON;

     MERGE t_person as [TARGET]
     USING (SELECT 
	@personid AS personid,  
	@peroncode AS peroncode
             )
     AS [SOURCE]
     ON ([SOURCE].personid = [TARGET].personid)
           


     WHEN MATCHED THEN
              UPDATE SET 
	 peroncode = ISNULL([SOURCE].peroncode,[TARGET].peroncode)

    WHEN NOT MATCHED THEN 
         INSERT (
                      personid,
                      personcode
	        )
         VALUES ( 
                 [SOURCE].personid,             
	         [SOURCE].peroncode
	)

     ;
END 
GO
15 авг 14, 18:11    [16447877]     Ответить | Цитировать Сообщить модератору
 Re: вопрос о optional parameter в хп.  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
anta-res
не получается записать значение null, остаётся 0 или 1.

Если такой записи нет, должно вставить NULL.
А если запись есть, оставит существующее значение.

Так что не так?
15 авг 14, 18:18    [16447900]     Ответить | Цитировать Сообщить модератору
 Re: вопрос о optional parameter в хп.  [new]
anta-res
Member

Откуда:
Сообщений: 41
usp_savepersoncode 1256; 


записывает в таблицу 1256 NULL

usp_savepersoncode 1256, 0;


записывает в таблицу 1256 0

usp_savepersoncode 1256, 1;


записывает в таблицу 1256 1

usp_savepersoncode 1256, null; 


по идее должно получится в таблице 1256 null
но остаётся предыдущее значение т.e 1256 1
15 авг 14, 18:33    [16447946]     Ответить | Цитировать Сообщить модератору
 Re: вопрос о optional parameter в хп.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
anta-res,

различить внутри процедуры, передавался или не передавался в нее опциональный параметр, не получится.
если такое действительно нужно, явно задавайте третий параметр, который будет указывать, надо ли апдейтить peroncode.
15 авг 14, 18:38    [16447964]     Ответить | Цитировать Сообщить модератору
 Re: вопрос о optional parameter в хп.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ну или указывайте значением по умолчанию что-то, что заведомо никогда передано быть не может. тип параметра сменить тогда придется.
15 авг 14, 18:40    [16447978]     Ответить | Цитировать Сообщить модератору
 Re: вопрос о optional parameter в хп.  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
anta-res
по идее должно получится в таблице 1256 null
но остаётся предыдущее значение т.e 1256 1

странная идея. как вы думаете, что должно вернуть выражение
ISNULL([SOURCE].peroncode,[TARGET].peroncode)
если [SOURCE].perncode у вас равен NULL?
15 авг 14, 18:42    [16447987]     Ответить | Цитировать Сообщить модератору
 Re: вопрос о optional parameter в хп.  [new]
anta-res
Member

Откуда:
Сообщений: 41
daw
daw
ну или указывайте значением по умолчанию что-то, что заведомо никогда передано быть не может. тип параметра сменить тогда придется.


Пробовал всё ,поле bit, варианты 0, 1, NULL (-1 толкуется как 1) и все могут передаваться. Что посоветуете?

daw
различить внутри процедуры, передавался или не передавался в нее опциональный параметр, не получится.
если такое действительно нужно . . .


жаль, я думал это возможно
15 авг 14, 23:40    [16448964]     Ответить | Цитировать Сообщить модератору
 Re: вопрос о optional parameter в хп.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
anta-res
Пробовал всё ,поле bit, варианты 0, 1, NULL (-1 толкуется как 1) и все могут передаваться. Что посоветуете?
Если в bit параметр влазит только 3 значения, то передавайте не bit, a tinyint например или же 2 параметра bit. Чего вы пытаетесь впихнуть невпихуемое?
15 авг 14, 23:54    [16449022]     Ответить | Цитировать Сообщить модератору
 Re: вопрос о optional parameter в хп.  [new]
aleks2
Guest
anta-res
[src]
usp_savepersoncode 1256, null; 


по идее должно получится в таблице 1256 null


     WHEN MATCHED THEN
              UPDATE SET 
	 peroncode = [SOURCE].peroncode
16 авг 14, 06:18    [16449549]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить