Это нормально, чтобы сделать вставку из вставки, используя значение замены переменной вместо столбца из вставки? - PullRequest
1 голос
/ 26 июля 2011

Привет, мне просто интересно!

Можно ли делать следующее;

INSERT INTO myTable(field1, field2, field3, field4, field5)

SELECT field1, field2, *@MyVariable*, field4, *@MyOtherVariable* FROM inserted

Только для моего младшего опыта, просить поле из вставленного, которое я заменилмое значение не кажется правильным.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 июля 2011

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

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

Ключ к пониманию правильности действий - посмотреть, что произойдет, если во вставленной таблице будет несколько записей.

Позвольте привести пример:

declare @client_id int
declare @date datetime
select @client_id = client_id from inserted
set @date = getdate()

insert table2 (client_id, action_date)
values (@client_id, @date)

В этом случае установка значения переменной для client_id неверна, поскольку во вставленной таблице может быть 1000 записей и 20 различных client_id. Однако установка поля даты будет хорошим вариантом использования переменной, поскольку вы хотите, чтобы дата действия была одинаковой для всего пакета.

1 голос
/ 26 июля 2011

У вас есть действительный оператор SQL там.

Вы можете использовать переменные и литералы в SELECT при вставке. Вы в основном говорите: «возьмите каждую строку из inserted и используйте одно значение соответственно для field3 и field5 в этих двух переменных, чтобы применить их ко всем строкам».

Звучит так, будто вы спрашиваете, «правильно» ли это. Это будет зависеть от вашей бизнес-логики или схемы. Возможно, ваши исходные таблицы не имеют column3 и column5. Возможно, они существуют, но они не нужны / не имеют отношения к вашему myTable.

Предложите опубликовать определение вашего триггера.

...