Одна хранимая процедура t-sql и обновление всей таблицы или - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть вопрос об обновлении таблицы через t-sql. Клиент может захотеть обновить один столбец в строке и оставить остальные без изменений, или он может захотеть обновить несколько столбцов. Итак, у меня есть два решения:

  1. Создайте один sp и обновите всю таблицу. Клиент должен предоставить все параметры, даже если он хочет обновить один столбец в строке, поэтому, если он передаст (что ему нужно) значение NULL для параметров, которых у него нет ... ну, оригинальные значения будут потеряны , В качестве обходного пути я могу использовать условия для проверки нулевых параметров (различные команды в зависимости от условия). Однако есть еще одна проблема, как я могу распознать параметр int? Я имею в виду, предположим, что у нас есть столбец int, который может иметь любые целочисленные значения, включая ноль, так что клиент должен послать в sp для того, чтобы сказать «это не новое значение, оставить значение как есть».

  2. Создать один sp на столбец. клиент будет использовать соответствующий sp для обновления одного столбца в строке, поэтому, если он хочет обновить несколько столбцов, он может вызывать каждый связанный sp один за другим и передавать два параметра, которые будут идентификатором строки (строк) и новым значением , Что если у меня есть таблица с 25 обновляемыми столбцами? О чувак! 25 обновлений sp только для одной таблицы!

Нужно ли создавать обновление sp для каждого столбца таблицы? Или создать один sp, который принимает все параметры строки и обновляет всю таблицу? Что является стандартом де-факто для написания процедур обновления?

EDIT1: Я использую SQL Server 2005 с внешним интерфейсом c # и приложением asp.net, но я хочу сделать это в t-sql.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2011

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

create procedure UpdateYourTable
  @ID int,
  @Col1 int = null,
  @Col2 int = null
as
update YourTable 
set Col1 = case when @Col1 is null 
             then Col1 
             else @Col1 
           end,
    Col2 = case when @Col2 is null 
             then Col2 
             else @Col2 
           end
where ID = @ID  

Выполните так, чтобы установить значение для Col2 и использовать значение по умолчанию null для Col1:

exec UpdateYourTable @ID = 1, @Col2 = 200
0 голосов
/ 11 декабря 2011

Если вы действительно должны сделать это в T-SQL, то единственный жизнеспособный подход для меня будет использовать динамический SQL.Если учесть это, вы должны сначала прочитать (и понять!) Превосходное эссе Эрланда Соммарскога Проклятие и благословение динамического SQL - абсолютное необходимо прочитать!

По сути, у вас будет один сохраненный процесс, который принимает ваши 25 параметров.Каждый из них может иметь значение NULL, если его не нужно обновлять.

Внутри хранимого процесса вы в основном создаете инструкцию T-SQL UPDATE на основе того, какие параметры не равны NULL, и вв конце концов, вы выполняете это утверждение.

Это дает вам одну процедуру, но на эту процедуру будет довольно грязно смотреться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...