有没有办法检索插入的命令行

时间:2011-04-14 13:38:39

标签: sql-server-2005

我们可能都知道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<

2 个答案:

答案 0 :(得分:4)

对于SQL Server 2005+,您可以使用OUTPUT子句。

DECLARE @InsertedIDs table(ID int);

INSERT INTO [dbo].[myMagicTable]
    OUTPUT INSERTED.ID
        INTO @InsertedIDs 
    SELECT ...

答案 1 :(得分:1)

您可以定义一个临时表(可能是表变量)并在INSERT上使用OUTPUT子句(您可以使用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

然后从那里开始。