输出到失败

pnwntuvh  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(216)

我试着一个接一个地做两个插页,比如:

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

但我有个错误:
消息207级别16状态1行13
列名“dispatchingid”无效。
消息207级别16状态1行13
列名“timefrom”无效。
消息207级别16状态1行13
列名“timeto”无效。
您可以在这里查看完整的代码:https://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=c10f9886bcfb709503007f18b24eabfd
如何组合这些插入?

disbfnqx

disbfnqx1#

这个 output 子句只能引用插入的列。所以这是可行的:

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

这是修改后的db<>小提琴。
如果你想要更多的信息,你需要加入到另一个来源。

vbopmzt1

vbopmzt12#

当你做一个 insert ... output ,则“输出”部分只能输出“插入”部分插入的内容。不能引用“插入”表中的数据。
你知道吗 insert into tbl_tours(TimeFrom) . 所以您只需要插入一个列—timefrom列,而tour\u id列将自动插入,所以这也是可用的。但是您尝试在输出列表中使用4列。这些额外的两列是从哪里来的?
一步到位的方法是使用 merge 语句,它可以从“inserting”源而不仅仅是“inserted”表中获取数据。既然你知道你总是想做一个插入,你可以加入 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的答案(insert和join),或者通过创建一个与 tbl_tourData ,使用 merge ,然后将第二个temp表转储到 tbl_tourData .

相关问题