Есть ли способ условно использовать значения столбца по умолчанию в инструкции INSERT..SELECT? - PullRequest
6 голосов
/ 02 марта 2010

У меня есть код, подобный следующему в хранимой процедуре, которая вставляет строку в таблицу, я хотел бы установить для последнего столбца (FieldD) значение @prmSomeValue, если оно не равно нулю, в противном случае просто используйте значение по умолчанию определено для этого столбца.

IF (@prmSomeValue IS NULL)
   INSERT INTO MyTable (fieldA,FieldB,FieldC)  
      SELECT A,B,C 
      FROM MyOtherTable
ELSE
   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,@prmSomeValue 
      FROM MyOtherTable

Это работает, но нарушает принцип СУХОЙ. Я пытаюсь найти способ сделать это с помощью одного оператора вставки. Что-то вроде следующего псевдокода.

   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
      FROM MyOtherTable

У кого-нибудь есть идеи?

Обновление - еще один поворот
Ограничение по умолчанию - это не буквальное значение, а функция, как показано ниже.

...DEFAULT (suser_sname()) FOR [FieldD]

Обновление
В конце концов, я выбрал меньшее из зол и просто скопировал функцию значения по умолчанию в свой запрос, вместо того, чтобы перейти к настройке по умолчанию, настроенной для столбца. Я не люблю это, но это выполняет работу с меньшим количеством повторений в моем запросе.

   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
      FROM MyOtherTable

Ответы [ 4 ]

3 голосов
/ 02 марта 2010

Поскольку, по сути, это то, что делает SQL Server, вы можете сделать что-то подобное, чтобы, по крайней мере, избежать двух почти идентичных операторов (псевдокод):

INSERT (columnA,B,C) ... ;

IF @prmSomeValue IS NOT NULL
    UPDATE ... ;

Я не думаю, что есть способ COALESCE со значением по умолчанию.

2 голосов
/ 03 марта 2010

Я бы сказал, что ваш метод в порядке. Простая проверка с последующей вставкой. Если вы беспокоитесь о СУХОЙ, инкапсулируйте вызов, чтобы он вызывался повторно.

Я бы сказал, что вставка / обновление в БД может быть дорогостоящим для некоторых таблиц (зависит от цели разработки), поэтому, если вам придется писать дополнительный код для обработки этого сценария, то я не вижу проблем с компромиссом.

0 голосов
/ 03 марта 2010

Примерно так может работать (хотя и не очень красиво):

INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
SELECT A,B,C,
    case when @prmSomeValue is null 
then
        (SELECT text FROM syscomments WHERE id IN (SELECT cdefault FROM syscolumns
            WHERE id = object_id('MyTable') AND cdefault > 0))
    else @prmSomeValue
    end
FROM MyOtherTable
0 голосов
/ 02 марта 2010

Это может работать, зависит от того, подразумеваете ли вы значение по умолчанию, определенное в ограничении по умолчанию или в коде? Если «ограничение» не удается, если «код» это работает. Редактировать : вы имеете в виду ограничение. DOH!

SELECT A,B,C,@prmSomeValue
      FROM MyOtherTable
      WHERE @prmSomeValue IS NOT NULL
UNION ALL
SELECT A,B,C,DEFAULT
      FROM MyOtherTable
      WHERE @prmSomeValue IS NULL

Каким бы способом вы не захотели это сделать, указание столбца в предложении INSERT требует значения.

Итак, ваше первое решение - это то, что вы делаете ...

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