OUTPUT INTO由于列名无效而失败



我正在尝试一个接一个地进行两个插入,如:

INSERT INTO tbl_tours (TimeFrom)
OUTPUT inserted.tourId, DispatchingId, TimeFrom, TimeTo INTO tbl_tourData (tour_fk, dispatchId, timeFrom, timeTo)
SELECT TimeFrom 
FROM @tmpTable
SELECT * FROM tbl_tours
SELECT * FROM tbl_tourData

但我得到了一个错误:

Msg 207 Level 16 State 1 Line 13
列名"DispatchingId"无效。

消息207级别16状态1第13行
列名"TimeFrom"无效。

消息207级别16状态1第13行
列名"TimeTo"无效。

您可以在这里查看完整的代码:https://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=c10f9886bcfb709503007 f18b24 eabfd

如何组合这些插件?

output子句只能引用插入的列。所以这是有效的:

INSERT INTO tbl_tours (TimeFrom)
output inserted.tourId, inserted.TimeFrom into tbl_tourData(tour_fk, timeFrom)
SELECT TimeFrom FROM @tmpTable;

这是修改后的db<gt;不停摆弄

如果您想要其他信息,您需要重新加入到另一个来源。

当您执行insert ... output时;输出";部件只能输出由";插入";部分您不能引用";插入";桌子

你做insert into tbl_tours(TimeFrom)。因此,您只插入一列——TimeFrom列,tour_id列将被自动插入,因此这也是可用的。但是,您尝试在输出列表中使用4列。这两列额外的柱子从哪里来?

在单个步骤中实现这一点的一种方法是使用merge语句,可以从";插入";来源,而不仅仅是";插入";桌子既然你知道你总是想插入,你可以加入on 1 = 0:

merge   tbl_tours 
using   @tmpTable tmp on 1 = 0
when    not matched then
insert  (TimeFrom)
values  (tmp.TimeFrom)
output  inserted.tourId,
tmp.dispatchingId,
inserted.timeFrom, -- or tmp.timeFrom, doesn't matter which
tmp.TimeTo
into    tbl_tourData (tour_fk, dispatchId, timeFrom, timeTo);

我应该补充一点:这是可能的,因为实际上没有定义从tbl_tourDatatbl_Tours的外键。您可能确实打算为您的列名指定一个。output子句不能输出到带有外键(或带有外键的主键(的表中,因此如果您决定实际创建该外键,则这种方法根本不起作用。你必须分两步来做。根据Gordon的回答(插入和联接(,或者创建一个与tbl_tourData模式匹配的全新临时表,使用merge将所有内容输出到该临时表中,然后将第二个临时表转储到实际的tbl_tourData中。

最新更新