使用 insert into select 将源列添加到输出子句

Posted

技术标签:

【中文标题】使用 insert into select 将源列添加到输出子句【英文标题】:Add source columns to output clause with insert into select 【发布时间】:2020-10-01 05:00:41 【问题描述】:

我的 c# 代码调用存储过程并将 tvp 作为参数传递给 storerd 过程。我需要将接收到的数据插入到几个数据库表中。

TVP schema:
TVP_ID int PRIMARY KEY IDENTITY, Col1 int, Col2 int, Col3 int.

首先,我需要将 Col1 插入 Table1:

Table1 schema:
Table1_ID int PRIMARY KEY IDENTITY, Col1 int

然后,我需要将所有列插入 Table2。

Table2 schema:
TVP_ID int, Col1 int, Col2 int, Col3 int, Table1_ID int

其中 TVP_ID 和 Table1_ID 是 TVP 和 Table1 表的主键。

我该怎么做?

谢谢!

编辑: 我的问题是,当我有 Table1(将数据插入 col1 之后)时,TVP 和 Table1 之间的连接不再存在。 TVP的key是TVP_ID,Table1的key是Table1_ID,我失去了他们之间的联系。

我插入了多行,所以一旦我在 Table1 中添加了多行,我如何才能在 table2 中插入多行?

【问题讨论】:

那么你的问题是什么? 我的问题是我该怎么做? 你想在哪里做?在 C# 中? MQSQL?在 SQL Server 中? 对不起,我想编写接收 TVP 的存储过程,并按照我上面解释的方式将数据插入到表中 这可以帮助你INSERT INTO table (name) VALUES('vivek'); SELECT SCOPE_IDENTITY()获取这个id并插入到第二个表中 【参考方案1】:

当您对 MSSQL 执行插入操作时,所有插入的数据都会临时存储。您可以使用 OUTPUT 子句访问数据。在此输出子句中,您有两种访问数据的方式。已插入。*(或指定的列)和已删除。。这样,您可以捕获插入或删除的相同数据,并将其路由到另一个表。使用 Insert 语句,您只能使用 OUTPUT 插入。,仅删除 OUTPUT 删除。* 和更新两者(更新毕竟只是删除,并且插入同一行具有 1 个或更多单元格已更改)

语法如下:

Insert Into table1(table1_ID, col1)
Output inserted.tabl1_id, inserted.col1 into table2
from .... (or Values()? )

插入后,您可以执行 OUTPUT 插入的.col1、插入的.col2 等 INTO table2。对于更新和删除,您可以使用相同的语法(OUTPUT deleted.* into )

如果您必须将数据复制到多个表中,您也可以将其存储在表变量或临时表中。请注意,除了表格之外,您不能存储任何东西,即使您知道它只会返回一行。这是因为虽然您可能知道它总是会返回 1 行,但 SQL 不会也不会让这成为问题。

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。

以上是关于使用 insert into select 将源列添加到输出子句的主要内容,如果未能解决你的问题,请参考以下文章

select into from和insert into select from两种表复制语句区别

insert into的用法

Oracle中insert into select和select into的区别

Oracle中insert into select和select into的区别

SELECT INTO 和 INSERT INTO SELECT比较

select into from 和 insert into select的使用