Sql server 从插入输出字段…使用选择结果中的字段选择查询

Sql server 从插入输出字段…使用选择结果中的字段选择查询,sql-server,Sql Server,我试图用Microsoft SQL Server中的INSERT…SELECT查询的输出填充关联表,但出现错误,找不到解决方法 这是我能想到的最简单、最可重复的问题:我有一个事物表,定义为: 创建表dbo.things id int IDENTITY1,1不是空主键, 名称nvarchar20非空唯一 ; 已经有人居住了。要使示例正常工作,请使用以下命令: 插入到dbo.things中 名称 值‘Thing1’、‘Thing2’、‘Thing3’; 现在我有了一个小部件表: 创建表dbo.wid

我试图用Microsoft SQL Server中的INSERT…SELECT查询的输出填充关联表,但出现错误,找不到解决方法

这是我能想到的最简单、最可重复的问题:我有一个事物表,定义为:

创建表dbo.things id int IDENTITY1,1不是空主键, 名称nvarchar20非空唯一 ; 已经有人居住了。要使示例正常工作,请使用以下命令:

插入到dbo.things中 名称 值‘Thing1’、‘Thing2’、‘Thing3’; 现在我有了一个小部件表:

创建表dbo.widgets id int IDENTITY1,1不是空主键, 说明nvarchar255 NULL ; 还有一个以多对多方式关联事物和小部件的表:

创建表dbo.thing\u widget\u关联 thing_id int NOT NULL引用dbo.thingsid, widget_id int NOT NULL引用dbo.widgetsid, 主键 事情, 小部件标识 ; 但是,每个东西都需要至少有一个小部件关联,但是缺少一些必要的小部件,因此我想创建它们,然后在同一个查询中将它们与相应的东西关联起来

以下是我尝试过的:

插入到dbo.widgets中 描述 输出 INSERTED.id,-新创建的小部件的标识符。
t、 id-关联对象的标识 根据文档,insert的输出可以只引用插入的表和删除的表。使用合并是一种解决方法

下面是如何使用合并进行重组

注意,对于示例表的约束,这会生成一个错误,即输出INTO子句的目标表“dbo.thing\u widget\u associations”不能位于主键和外键关系的任意一侧。找到引用约束“FK__thing_wid__thing__2BFE89A6”


因此,我在表中没有这些选项的情况下进行了测试。

使用merge。谢谢你,斯图!哇!在一百万年内,我绝对不会想到这一点!如果你有机会写下来作为答案,我会马上接受!
merge dbo.widgets t
using (
    select 'Default widget for thing ' + t.name w, t.id
    from dbo.things as t
    left join dbo.thing_widget_associations twa on twa.thing_id = t.id
    where twa.thing_id is null
)s on 1=0
when not matched then 
insert (description) values (s.w)
output INSERTED.id, s.id 
into dbo.thing_widget_associations(widget_id, thing_id);