我们可能都知道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<
答案 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
然后从那里开始。