powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Шаблон SP для определения переданных параметров
25 сообщений из 34, страница 1 из 2
Шаблон SP для определения переданных параметров
    #40111304
Tketano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, добрый день!

В хранимой процедуре необходимо понимать, какие параметры не были переданы, а каким параметрам передано значение NULL (т.е. определить смысл значения NULL). Это необходимо для реализации логики обновления полей (если не передано значение - не трогаем, передано - обновляем). У кого-нибудь есть пример шаблона хранимой процедуры для решения данной задачи?

Вижу 2 варианта.
1) Ввести входной параметр маски реально переданных параметров (т.е. вызывающая сторона уточняет перечень передаваемых параметров);
2) Определить специальные значения входных параметров, которые будут указывать, что передано пустое значение (т.е. default значение null означает отсутствие передачи параметра, а пустая строка, например для varchar, означает необходимость сбросить значение поля в БД в NULL).

Спасибо)
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111313
Guf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tketano,

Вариант 3. Не выворачивать мозги. Передавать всегда и всё и обновлять тем, что передано.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111343
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tketano,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or alter procedure [usp_update]
         @id int,
         @val1 varchar(255) = null,
         @val2 varchar(255) = null
as
update [dbo].[tbl]
   set [val1] = isnull(@val1, [val1]),
       [val2] = isnull(@val2, [val2])
where [id] = @id;



?
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111353
Tketano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guf,
авторВариант 3. Не выворачивать мозги. Передавать всегда и всё и обновлять тем, что передано.
Есть сущности, содержащие более 100 столбцов. Объявлять овер 100 переменных и начитывать их перед EXEC - ну такое себе.
И, часто, надо обновить лишь небольшую часть столбцов. Понятно, что бизнес-логика должна быть разбита по разным ХП, но не всегда и не везде это получается. Прямые UPDATE на таблицу не рассматриваются, т.к. пролетают мимо важных контролей внутри ХП.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111356
Tketano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
Tketano,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or alter procedure [usp_update]
         @id int,
         @val1 varchar(255) = null,
         @val2 varchar(255) = null
as
update [dbo].[tbl]
   set [val1] = isnull(@val1, [val1]),
       [val2] = isnull(@val2, [val2])
where [id] = @id;



?


Это работает до тех пор, пока вам не надо "пропихнуть" NULL как реальное значение. Т.е. вы никогда не сможете обnullить значение в БД.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111413
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tketano,
делайте тогда процедуру, у которой на входе будет названия поля и значение (или несколько в зависимости от типов данных, или с преобразованием в зависимости от типа поля целевой таблицы) и внутри процедуры пилите динамический sql на изменение конкретного поля или портянку на 100500 строк с условиями/case when
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111417
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А есть еще вариант реализации, поражающий своим безграничным ужасом - формировать update нужного поля (или полей) на клиенте.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111459
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tketano,

это кручу-верчу бред, сделайте все параметры обязательными для заполнения. За угадыванием надо к гадалке ходить, а не программы писать.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111462
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy st
Tketano,
делайте тогда процедуру, у которой на входе будет названия поля и значение (или несколько в зависимости от типов данных, или с преобразованием в зависимости от типа поля целевой таблицы) и внутри процедуры пилите динамический sql на изменение конкретного поля или портянку на 100500 строк с условиями/case when
Не дай Бог такое унаследовать и поддерживать. Боль.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111463
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulYoung
andy st
Tketano,
делайте тогда процедуру, у которой на входе будет названия поля и значение (или несколько в зависимости от типов данных, или с преобразованием в зависимости от типа поля целевой таблицы) и внутри процедуры пилите динамический sql на изменение конкретного поля или портянку на 100500 строк с условиями/case when
Не дай Бог такое унаследовать и поддерживать. Боль.

Человек хочет боль, человек получит боль
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111469
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соглашаясь с тем что это боль

поддерживаю вариант 1 с маской полей (или несколькими масками если полей много)
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111499
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы еще определитесь с тем, кто же по планам будет больше страдать в процессе разработки взаимодействия клиентского ПО с базой - разработчик клиентского софта или разработчик субд. Ну и к этому прикрутите их квалификацию.
Если разраб клиента "эпичен", а разработчик субд из начинающих - пусть колбасят ad-hoc на update на клиенте, не такая сложная задача. Это если контроли в хп можно на триггеры заменить
Если разраб клиента умеет подставлять параметры в процедуру, а разраб СУБД крут - любой вариант с сложной и поддерживаемой с болью логикой в процедуре, в том числе и вариант с параметрами "название поля" и "значение поля" - не факт что такой разработчик клиента осилит запилить маску полей для заполнения
Если оба достаточно компетентны - развлекайтесь как вам угодно, благо возможностей для реализации такого глума тьма
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111542
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tketano
felix_ff
Tketano,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or alter procedure [usp_update]
         @id int,
         @val1 varchar(255) = null,
         @val2 varchar(255) = null
as
update [dbo].[tbl]
   set [val1] = isnull(@val1, [val1]),
       [val2] = isnull(@val2, [val2])
where [id] = @id;



?


Это работает до тех пор, пока вам не надо "пропихнуть" NULL как реальное значение. Т.е. вы никогда не сможете обnullить значение в БД.


ну окей, объявите у параметров явные дефолты и сверяйтесь с ними
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or alter procedure [usp_update]
         @id int,
         @val1 varchar(255) = '__default_va1',
         @val2 varchar(255) = '__default_val2'
as
update [dbo].[tbl]
   set [val1] = case when @val1 = '__default_val1' then [val1] else @val1 end,
       [val2] = case when @val2 = '__default_val2' then [val2] else @val2 end
where [id] = @id;



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

но имхо: по большей части вы занимаетесь ерундой, контроль правильности значений должен быть на стороне сервера приложений/клиентской части.

сейчас в меня полетят ссаные тряпки адептов реализации бизнес логики на стороне СУБД
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111545
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
нужно правда придумать такие дефолты которые в принципе никогда не встретятся в качестве реальных значений таблицы.

гуиды вполне проканают, для параноиков - пара гуидов
felix_ff

но имхо: по большей части вы занимаетесь ерундой, контроль правильности значений должен быть на стороне сервера приложений/клиентской части.

сейчас в меня полетят ссаные тряпки адептов реализации бизнес логики на стороне СУБД

лови первый :)
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111548
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Принимать на входе XML/Json и формировать по нему динамический Update предлагали?
Если плевать на производительность, то может прокатить.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111555
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А потом тредстартер прочитает что ему тут насоветовали и скажет: "да ну нахрен, пойду в дворники"
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111626
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений
Принимать на входе XML/Json и формировать по нему динамический Update предлагали?
Если плевать на производительность, то может прокатить.


хотите пострадать фигней? :)

CLR процедуры сохраняют свои default value параметров в sys.parameters.
если прямо сильно заморочиться можно нарисовать CLR обертку где дефолты будут явно тянуться при явном игноре входного параметра.
другой вопрос: что скажут остальные разрабы когда создатель любой "мегофичи" уволится, а им потребуется насладится поддержкой его "высокого полета мысли" :)
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111713
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

трансляция XML в Update в общем не сложна, логика наглядна. Думаю, что поддерживать такое было бы менее противно, чем описанное вами.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111747
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tketano
Guf,
авторВариант 3. Не выворачивать мозги. Передавать всегда и всё и обновлять тем, что передано.

Есть сущности, содержащие более 100 столбцов. Объявлять овер 100 переменных и начитывать их перед EXEC - ну такое себе.
И, часто, надо обновить лишь небольшую часть столбцов. Понятно, что бизнес-логика должна быть разбита по разным ХП, но не всегда и не везде это получается. Прямые UPDATE на таблицу не рассматриваются, т.к. пролетают мимо важных контролей внутри ХП.

Люди-то в основном злые, не стоит расчитывать на понимание
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111825
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Tketano
пропущено...


Это работает до тех пор, пока вам не надо "пропихнуть" NULL как реальное значение. Т.е. вы никогда не сможете обnullить значение в БД.


ну окей, объявите у параметров явные дефолты и сверяйтесь с ними
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or alter procedure [usp_update]
         @id int,
         @val1 varchar(255) = '__default_va1',
         @val2 varchar(255) = '__default_val2'
as
update [dbo].[tbl]
   set [val1] = case when @val1 = '__default_val1' then [val1] else @val1 end,
       [val2] = case when @val2 = '__default_val2' then [val2] else @val2 end
where [id] = @id;



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

но имхо: по большей части вы занимаетесь ерундой, контроль правильности значений должен быть на стороне сервера приложений/клиентской части.

сейчас в меня полетят ссаные тряпки адептов реализации бизнес логики на стороне СУБД



Код: sql
1.
2.
3.
4.
5.
create or alter procedure [usp_update]
         @id int,
         @val1 varchar(255) = null, @val1On bit = 0,
         @val2 varchar(255) = null, @val2On bit = 0
as



Универсальные лисапеды всегда громоздки...
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111853
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tketano
И, часто, надо обновить лишь небольшую часть столбцов. Понятно, что бизнес-логика должна быть разбита по разным ХП, но не всегда и не везде это получается. Прямые UPDATE на таблицу не рассматриваются, т.к. пролетают мимо важных контролей внутри ХП.
Разбить обновления на разные ХП можно всегда.
Или можно делать контроль в триггерах.
Про всё это уже написали, я уверен, что эти решения будут лучше, чем изощрённая логика со 100 флагами.
Проще для разработки, для расширения функционала, для сопровождения, и будут содержать меньше ошибок.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111856
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Tketano
И, часто, надо обновить лишь небольшую часть столбцов. Понятно, что бизнес-логика должна быть разбита по разным ХП, но не всегда и не везде это получается. Прямые UPDATE на таблицу не рассматриваются, т.к. пролетают мимо важных контролей внутри ХП.
Разбить обновления на разные ХП можно всегда.
Или можно делать контроль в триггерах.
Про всё это уже написали, я уверен, что эти решения будут лучше, чем изощрённая логика со 100 флагами.
Проще для разработки, для расширения функционала, для сопровождения, и будут содержать меньше ошибок.
Я даже больше скажу.

Подход "сделать процедуры для изменения любого набора полей" противоречит вашему же подходу "обрабатывать данные в СУБД, предоставляя API клиентам (серверам приложений и др.)"
Вы хотите дать возможность делать ad-hoc запросы к базе, только через процедуры, что абсолютно лишено смысла как бизнес, так и технологического. Процедуры ради процедур. Вырождение идеи "СУБД предоставляет API для работы с данными".
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40111956
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
но не всегда и не везде это получается



это не может получаться только при отсутствии желания это делать.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40112035
Tketano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за мнения! Динамический SQL явно мимо; финальные контроли осуществляются на сервере. Может изначально плохо пояснил задачу. Смысл в том, что есть много входных точек для изменения данных (api), реализующих разные форматы и разный набор полей. Соответственно вопрос был в обновлении информации в базе данных (после приема входящего запроса).
Пока остановились на следующем варианте:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create or alter procedure [usp_update_some_rekv]
	@id	int,
	@val1	int		= null,	-- -1 = сбросить в null (значение -1 не допускается бизнес-логикой)
	@val2	varchar(255)	= null,	-- '' = сбросить в null (пустая строка не допускается бизнес-логикой)
	@val3	date		= null	-- '' = сбросить в null (1900 год не допускается бизнес-логикой)
as

select	@val1 = case when @val1 = -1 then null else isnull(@val1, val1) end,
	@val2 = case when @val2 = '' then null else isnull(@val2, val2) end,
	@val3 = case when @val3 = '' then null else isnull(@val3, val3) end
from	[dbo].[tbl]
where	[id] = @id;

-- базовая процедура для записи параметров "как есть"
exec dbo.usp_update
		@id	= @id,
		@val1	= @val1,
		@val2	= @val2,
		@val3	= @val3
go



Хотя итоговое решение не понравилось (вызов такой ХП выглядит "неестественным"). Пока будет использоваться исключительно локально (для решения конкретной задачи). Возможно, часть контролей будет перенесена + прямой UPDATE таблицы + прочая логика процедуры usp_update.
...
Рейтинг: 0 / 0
Шаблон SP для определения переданных параметров
    #40112049
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
@val3	date
...
@val3 = case when @val3 = ''
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Шаблон SP для определения переданных параметров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]