INSERT-OUTPUT 包括来自其他表的列

Posted

技术标签:

【中文标题】INSERT-OUTPUT 包括来自其他表的列【英文标题】:INSERT-OUTPUT including column from other table 【发布时间】:2013-02-23 06:40:59 【问题描述】:

我有一个存储过程需要插入到三个不同的表中,但我需要获取从一个输入生成的 ID 并使用它插入到下一个表中。我熟悉 INSERT-OUTPUT 构造,但我不确定在这种特殊情况下如何使用它。

DECLARE @guids TABLE ( [GUID] UNIQUEIDENTIFIER );
DECLARE @contacts TABLE ( [ContactID] INT, [GUID] UNIQUEIDENTIFIER );
DECLARE @mappings TABLE ( [TargetID] INT, [GUID] UNIQUEIDENTIFIER );

INSERT @guids ( [GUID] ) ...

INSERT [Contacts] ( [FirstName], [LastName], [ModifiedDate] )
OUTPUT [inserted].[ContactID], g.[GUID]
INTO @contacts
SELECT [First_Name], [Last_Name], GETDATE()
FROM [SourceTable] s
JOIN @guids g ON s.[GUID] = g.[GUID]

INSERT [TargetTable] ( [ContactID], [License], [CreatedDate], [ModifiedDate] )
OUTPUT [inserted].[TargetID], c.[GUID]
INTO @mappings
SELECT c.[ContactID], [License], [CreatedDate], [CreatedDate]
FROM [SourceTable] s
JOIN @contacts c ON s.[GUID] = c.[GUID] 

INSERT [Mappings] ( [TargetID], [SourceGUID] )
SELECT [TargetID], [GUID]
FROM @mappings

但我收到以下错误:

无法绑定多部分标识符“g.GUID”。

无法绑定多部分标识符“c.GUID”。

如果我改用s.GUID,我会得到类似的错误。是否可以在OUTPUT 子句中进行某种联接?

【问题讨论】:

您收到错误是因为您不能在插入上使用除 INSERTED 或 DELETED 引用以外的任何东西(这意味着您当然只能使用 INSERTED)。通过更新和删除,您可以引用查询中使用的其他表。只要您使用的是 SQL Server 2008 或更高版本,下面的合并选项就应该可以工作。我发现这样做的唯一方法是在我插入的表上找到一个未使用的列,并将值(在你的情况下为 guid)放入该列,然后返回并稍后拉出该列(并将其更新回 null 使其不会留在那里)。 试试这个插入的.GUID 【参考方案1】:

我不确定这是否是最佳选择,但您似乎可以使用 MERGE 来解决问题:

MERGE [Contacts]  trgt
USING 
(  
  SELECT [First_Name], [Last_Name], g.[GUID] as [GUID]
  FROM [SourceTable] s
  JOIN @guids g ON s.[GUID] = g.[GUID]
)src ON (1=0)
WHEN NOT MATCHED THEN INSERT ( [FirstName], [LastName], [ModifiedDate] )
 VALUES (src.[First_Name],src.[Last_Name], GETDATE())
OUTPUT [inserted].[ContactID], src.[GUID]
INTO @contacts

【讨论】:

请原谅我的无知。我从未使用过MERGE,甚至从未见过它在野外使用过。你能解释一下这段代码吗? Dr. OUTPUT or: How I Learned to Stop Worrying and Love the MERGE 那是一篇很棒的文章。但是,对您的问题的简短回答是,MERGE 允许在单个语句中组合 INSERT、UPDATE 和 DELETE 的任意组合(此代码强制执行 INSERT)。 MERGE 在这里对您很有用,因为它允许在 OUTPUT 子句中使用来自不同表的列,而 INSERT 则不允许。 @GilM 和一个关于它的问题here @MikaelEriksson 或Dr. OUTPUT or: How I Learned to Stop Worrying and Love the MERGE 的更新链接,如果另一个不起作用。

以上是关于INSERT-OUTPUT 包括来自其他表的列的主要内容,如果未能解决你的问题,请参考以下文章

我想知道使用 INNER JOIN 和相等运算符更快,或者当我尝试通过另一个表的列过滤表中的数据时使用 IN

全文包含来自另一个表的列

组合来自 2 个单独的 SQL 表的列数据

在选择不同的行时统一来自不同表的列

更新之前的Oracle SQL触发器,用于设置来自其他实体的列值

将来自同一表的单独查询组合为单独的列