Sql 插入-输出,包括来自其他表的列

Sql 插入-输出,包括来自其他表的列,sql,sql-server,tsql,sql-insert,Sql,Sql Server,Tsql,Sql Insert,我有一个需要插入到三个不同表中的存储过程,但我需要获取从一个输入生成的ID,并使用该ID插入到下一个表中。我熟悉INSERT-OUTPUT结构,但我不确定在这种特殊情况下如何使用它 DECLARE @guids TABLE ( [GUID] UNIQUEIDENTIFIER ); DECLARE @contacts TABLE ( [ContactID] INT, [GUID] UNIQUEIDENTIFIER ); DECLARE @mappings TABLE ( [TargetID] IN

我有一个需要插入到三个不同表中的存储过程,但我需要获取从一个输入生成的ID,并使用该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
,我也会遇到类似的错误。是否可以在
输出
子句中进行某种联接?

我不确定这是否是最佳选择,但似乎您可以使用
合并
来实现这一点:

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

您之所以会出现错误,是因为您不能在INSERT上使用插入或删除的引用以外的任何内容(当然,这意味着您只能使用INSERTED)。通过更新和删除,您可以引用查询中使用的其他表。只要您使用的是SQL Server 2008或更高版本,下面的合并选项就应该有效。我发现的唯一方法是在我要插入的表中找到一个未使用的列,并将值(在您的情况下是guid)放入该列,然后返回并稍后拉出该列(并将其更新回null,使其不会停留在该列中)。请尝试此插入。guid请原谅我的无知。我从未使用过
MERGE
,甚至从未见过它在野外使用过。你能解释一下这个代码吗?这是一篇很好的文章。但是,对您的问题的简短回答是,MERGE允许在单个语句中组合INSERT、UPDATE和DELETE的任意组合(此代码强制插入)。在这里,MERGE对您很有用,因为它允许在OUTPUT子句中使用不同表中的列,而INSERT不允许。@GilM和一个关于它的问题@MikaelEriksson或一个更新的链接,如果另一个不起作用。