Вот что я пытался с моей линией допроса. Если у вашего центрального генератора IDENTITY
есть дополнительный бесполезный столбец, это может избежать вставки строк с DEFAULT VALUES
, что равно difficult, cumbersome and downright unintuitive to do with more than one row (и, возможно, невозможно, скажем, в SQL Server 2005). Так, изображая эту таблицу генератора выглядит следующим образом:
CREATE TABLE dbo.OtherTable(OtherTableID INT IDENTITY(1,1), UselessColumn BIT);
И реальный стол вы вставка в выглядит следующим образом:
CREATE TABLE dbo.MyTable(ID INT IDENTITY(1,1), [No] INT, foo VARCHAR(32));
Мы можем создать INSTEAD OF INSERT
триггер, который вставляет несколько строк в dbo.OtherTable
, захватывает набор из IDENTITY
значений, сгенерированных, затем в конечном итоге вставляет эти значения вместе с реальными данными, назначая каждое сгенерированное значение в одну строку произвольно.
CREATE TRIGGER dbo.trMyTable
ON dbo.MyTable
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @newIDs TABLE(ID INT IDENTITY(1,1), [No] INT);
INSERT dbo.OtherTable(UselessColumn)
OUTPUT inserted.OtherTableID INTO @newIDs([No])
SELECT NULL FROM inserted;
INSERT dbo.MyTable([No],foo)
SELECT n.[No], i.foo FROM @newIDs AS n
INNER JOIN
(
SELECT *, rn = ROW_NUMBER() OVER (ORDER BY foo) FROM inserted
) AS i ON i.rn = n.ID;
END
GO
Причина INSTEAD OF INSERT
триггер лучше, потому что это позволяет избежать двойной работы (вставить кучу строк, а затем обновить их все). Очевидно, что у вас больше столбцов, чем foo
; это просто упрощенная демонстрация.
Если вам также необходимо сделать что-то подобное для пакетных обновлений, вам придется обновить вопрос с большим количеством требований (и включить информацию, такую как первичный ключ в целевой таблице).
Вы пытаетесь поместить то же значение @No во все обновленные строки или отдельное значение для каждой строки? –
Можно ли изменить функцию proc на функцию? –
@JoachimIsaksson Отдельное значение за строку. Что касается идеи функции, я буду исследовать ее. – Doomsknight