Есть ли способ получить вставленные строки команды - PullRequest
1 голос
/ 14 апреля 2011

Мы, наверное, все знаем SCOPE_IDENTITY(), чтобы получить идентификатор, созданный одной вставкой. В настоящее время мне нужна какая-то магическая переменная или функция для извлечения всех строк, сгенерированных оператором, например:

INSERT INTO [dbo].[myMagicTable]
(
    [name]
)
SELECT    [name]
FROM      [dbo].[myMagicSource]
WHERE     /* some weird where-clauses with several subselects ... */;

INSERT INTO [dbo].[myMagicBackupTable]
(
    [id],
    [name]
)
SELECT
    [id],
    [name]
FROM    ???

Триггер вставки не является опцией, так как он будет выполнять одиночную вставку, что является проблемой для пакета из 10.000 строк ... Так есть ли способ добиться этого? Мы используем mssql2005 <</p>

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

Для SQL Server 2005+ вы можете использовать предложение OUTPUT .

DECLARE @InsertedIDs table(ID int);

INSERT INTO [dbo].[myMagicTable]
    OUTPUT INSERTED.ID
        INTO @InsertedIDs 
    SELECT ...
1 голос
/ 14 апреля 2011

Вы можете определить временную таблицу (возможно, переменную таблицы) и использовать предложение OUTPUT в своей INSERT (вы можете использовать псевдотаблица Inserted, как в триггере):

DECLARE @NewIDs TABLE (MagicID INT, Name VARCHAR(50))

INSERT INTO [dbo].[myMagicTable]([name])
OUTPUT Inserted.MagicID, Inserted.Name INTO @NewIDs(MagicID, Name)
  SELECT    [name]
  FROM      [dbo].[myMagicSource]
  WHERE     /

, а затем используйте эту табличную переменную после INSERT:

INSERT INTO 
  [dbo].[myMagicBackupTable]([id], [name])
  SELECT MagicID, [name]
  FROM @NewIDs

и перейдите оттуда.

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