您不能在带有 INSERT 语句的 OUTPUT 子句中引用 FROM 表。您只能使用 DELETE、UPDATE 或 MERGE 语句执行此操作。
来自 MSDN 页面上的 OUTPUT 子句 (https://msdn.microsoft.com/en-us/library/ms177564.aspx)
from_table_name 是列前缀,指定包含在
使用的 DELETE、UPDATE 或 MERGE 语句的 FROM 子句
指定要更新或删除的行。
您可以使用 MERGE 语句来完成您的要求。
在下面的示例中,我将表更改为所有变量表,以便可以将其作为独立查询运行,并且我将 ID 列更改为 IDENTITY 列,这些列以不同的方式递增以说明关系。
ON 子句 (1=0) 将始终评估为 NOT MATCHED。这意味着 USING 语句中的所有记录都将用于插入到目标表中。此外,USING 语句中的 FROM 表将可用于 OUTPUT 语句。
DECLARE @Foo TABLE (FooId INT IDENTITY(1,1), MyData NVarchar(20))
DECLARE @Revisions TABLE (RevId INT IDENTITY(100,10), CreatedTimeStamp DATETIME)
DECLARE @InsertedRows TABLE (RevId INT, FooId INT)
INSERT INTO @Foo VALUES ('FooData1'), ('FooData2'), ('FooData3')
MERGE @Revisions AS [Revisions]
USING (SELECT FooId FROM @Foo) AS [Foo]
ON (1=0)
WHEN NOT MATCHED THEN
INSERT (CreatedTimeStamp) VALUES (CURRENT_TIMESTAMP)
OUTPUT INSERTED.RevId, Foo.FooId INTO @InsertedRows;
SELECT * FROM @Foo
SELECT * FROM @Revisions
SELECT * FROM @InsertedRows
上述查询的表格结果
@Foo table
+-------+----------+
| FooId | MyData |
+-------+----------+
| 1 | FooData1 |
| 2 | FooData2 |
| 3 | FooData3 |
+-------+----------+
@Revisions table
+-------+-------------------------+
| RevId | CreatedTimeStamp |
+-------+-------------------------+
| 100 | 2016-03-31 14:48:39.733 |
| 110 | 2016-03-31 14:48:39.733 |
| 120 | 2016-03-31 14:48:39.733 |
+-------+-------------------------+
@InsertedRows table
+-------+-------+
| RevId | FooId |
+-------+-------+
| 100 | 1 |
| 110 | 2 |
| 120 | 3 |
+-------+-------+