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

Откуда:
Сообщений: 98
Доброго дня!
Возник вопрос на следующую тему - есть ли возможность узнать, что пользователь в явном виде передал значение параметра (в том случае, если есть дефолт-значение)?

И сразу скажу какую задачу я пытаюсь решить. Есть хранимая процедура DOCUMENT_UPDATE, которая реализует проверку реквизитов документа и непосредственно само сохранение данных. Сейчас ХП работает в режиме коррекции по всем реквизитам. Необходимо добавить возможность коррекции только переданных реквизитов. Дефолт-значение всех необязательных параметров NULL.

Можно, конечно, добавить параметр типа обновления @TYPE_UPDATE и при коррекции только переданных реквизитов использовать конструкцию ISNULL(), но это исключит возможность сброса значений в документе.

Заранее спасибо
13 май 15, 13:09    [17633657]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Владислав Колосов
Member

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

корректируйте те значения, которые отличаются от текущих в базе.
13 май 15, 13:28    [17633824]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Можете попробовать сделать параметры типа sql_variant и анализировать их реальный тип:
use tempdb;
go

create procedure dbo.p1
 @v sql_variant = ''
as
begin
 set nocount on

 select sql_variant_property((select @v), 'BaseType');
end;
go

exec dbo.p1;
exec dbo.p1 1;
exec dbo.p1 null;
go

drop procedure dbo.p1;
go
13 май 15, 13:54    [17634104]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Tketano
Member

Откуда:
Сообщений: 98
Владислав Колосов,

Тогда я сброшу все не переданные реквизиты в документе.

Например, есть параметр хр.п. @NAME char(10) = NULL. А в самом документе DOCUMENT.NAME = 'Заявление'. И не понятно, то ли необходимо закатать значение в NULL, то ли значение не было передано.
13 май 15, 14:08    [17634231]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Tketano
Member

Откуда:
Сообщений: 98
invm, менять тип существующих параметров не вариант...
13 май 15, 14:11    [17634256]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tketano
И не понятно, то ли необходимо закатать значение в NULL, то ли значение не было передано.

Пусть об этом думает пользователь/программа, которая формирует строку вызова
Почему сервер должен угадывать, что именно хотел сделать клиент ?
13 май 15, 14:14    [17634273]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
Tketano
Тогда я сброшу все не переданные реквизиты в документе.

Например, есть параметр хр.п. @NAME char(10) = NULL. А в самом документе DOCUMENT.NAME = 'Заявление'. И не понятно, то ли необходимо закатать значение в NULL, то ли значение не было передано
Так надо для каждого типа своё значение.
Например, в данном случае признаком того, что менять не надо, можно сделать пустую строку.
А для целого числа это может быть максимальное значение для типа.
13 май 15, 14:15    [17634279]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
Glory
Пусть об этом думает пользователь/программа, которая формирует строку вызова
В смысле, отказаться от процедур, всегда передавать запросы, сформированные в коде?
13 май 15, 14:16    [17634290]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Tketano
Member

Откуда:
Сообщений: 98
Glory, Тогда идея частичного обновления реквизитов документа не будет работать в принципе. Все сведется к получению всех реквизитов документа и обратным вызовом хп.п. UPDATE.
А есть острая необходимость предусмотреть именно описанный ранее режим работы процедуры. Пока вижу вариант только обрабатывать NOT NULL параметры.
13 май 15, 14:18    [17634302]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexeyvg
Glory
Пусть об этом думает пользователь/программа, которая формирует строку вызова
В смысле, отказаться от процедур, всегда передавать запросы, сформированные в коде?

Вовсе нет.
Если клиент сам не знает, что для него означает NULL при попытке изменения записи, то даже прямой запрос не поможет
13 май 15, 14:19    [17634320]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Tketano
Member

Откуда:
Сообщений: 98
alexeyvg, Кстати, можно развить идею с пустой строкой для сброса значения. В документе не допускается наличие пустых полей, в этих случаях записывается NULL.
13 май 15, 14:20    [17634328]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tketano
Glory, Тогда идея частичного обновления реквизитов документа не будет работать в принципе. Все сведется к получению всех реквизитов документа и обратным вызовом хп.п. UPDATE.
А есть острая необходимость предусмотреть именно описанный ранее режим работы процедуры. Пока вижу вариант только обрабатывать NOT NULL параметры.

Вы путаете красное и соленое
До того, как что-то будет меняться, это что-то должно быть прочитано
И если клиент прочитал _все_ значения полей, то пусть и обратно передает все значения. А не только те, которые ему нравяться
13 май 15, 14:22    [17634341]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Tketano
Member

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

Данный механизм делается не просто так. В некоторых случаях необходимо произвести замену лишь части основных реквизитов документа. Вытаскивать документ на стороне сервера не очень удобно, более 70 столбцов. Доступ к данным только через хр.п.
13 май 15, 14:28    [17634399]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
create procedure dbo.MyProc
 @param1 nvarchar(max) = '<none>',
 @param2 nvarchar(max) = '<none>',
 ...
as
begin
SET NOCOUNT ON;


 IF (@param1 <> '<none>')
 Begin
 ...


и на клиентской части просто не передавайте параметры, которые не заполняете, тогда в качестве дефолта там будут '<none>'
13 май 15, 14:31    [17634437]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Ну тогда закатайте параметры в XML, перепишите клиента и процедуру для обработки XML данных. Там вы точно увидите, что было передано, а что нет. Если значение пусто - значит надо сбросить его в NULL, если отсутствует - не трогать.
13 май 15, 16:01    [17635251]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tketano
Вытаскивать документ на стороне сервера не очень удобно, более 70 столбцов. Доступ к данным только через хр.п.

Создается такое впечатление, что у вас серверные процедуры вызывают свми себя.
А клиент вообще никак не участвует тв формировании команды вызова процедуры
14 май 15, 08:17    [17637699]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
Tketano
alexeyvg, Кстати, можно развить идею с пустой строкой для сброса значения. В документе не допускается наличие пустых полей, в этих случаях записывается NULL.
Ну да, вот по каждому полю и надо находить решение.

Или действительно сделать некий набор признаков обновления полей, как универсальное решение. Или в XML, как уже написали.

Glory
И если клиент прочитал _все_ значения полей, то пусть и обратно передает все значения. А не только те, которые ему нравяться
В принципе обновлять только изменённые поля - это хорошо, зачем серверу делать лишние действия? Да и поля читаются не всегда "все". А процедуры не хочется писать разные для разных пользовательских форм.

Другое дело, что это трудоёмко, выгодно не всегда (всё равно обновляем страницу целиком), и имеет смысл только для определённых случаев, например, для BLOB-полей.
14 май 15, 11:44    [17638642]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметров в хранимые процедуры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Как я понимаю, сервер пишет в таблицу не отдельное поле за раз, а запись целиком. Поэтому нет разницы - обновить поле тем же значением, если оно не было изменена, вместе с другими изменёнными полями или обновить выборочно.
Другое дело - что значит NULL при передаче в процедуру - то ли не было передано, то ли бы было.
В свете вышесказанного надо просто избавиться от дефолтных параметров.

Хотя лично мне таблицы с 70 полями кажутся сомнительными.
14 май 15, 11:55    [17638736]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить