【问题标题】:Complex TSQL MultiRow Insert with OutPut带输出的复杂 SQL 多行插入
【发布时间】:2016-04-01 06:41:16
【问题描述】:

我有一个临时表如下

DECLARE @InsertedRows TABLE (RevId INT, FooId INT) 

我还有另外两张桌子

Foo(FooId INT, MyData NVarchar(20))
Revisions(RevId INT, CreatedTimeStamp DATETIME)

对于 Foo 中的每一行,我需要 a) 在 Revisions 中插入一行 b) 在 @InsertedRows 中插入一行,并使用 Foo 和 Revisions 中的相应 Id 值。

我尝试使用插入输出选择写一些东西,如下所示:

INSERT INTO Revisions (CURRENT_TIMESTAMP)
OUTPUT Inserted.RevId, Foo.FooId INTO @InsertedRows 
SELECT FooId From Foo

但是,Foo.Id 不允许出现在输出列列表中。此外,SELECT 中返回的 Id 没有插入到表中,所以这是另一个问题。

我该如何解决这个问题?

【问题讨论】:

  • 请准备完整的架构(身份列/...)和示例数据。 sqlfiddle.com

标签: tsql


【解决方案1】:

您不能在带有 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 |
+-------+-------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2017-02-25
    相关资源
    最近更新 更多