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

p.s*_*w.g 26 sql t-sql sql-server sql-insert

我有一个存储过程需要插入到三个不同的表中,但我需要从一个输入中获取生成的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
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

无法绑定多部分标识符"g.GUID".

无法绑定多部分标识符"c.GUID".

如果我改用,我会得到类似的错误s.GUID.是否可以在OUTPUT条款中进行某种加入?

a1e*_*x07 34

我不确定这是否是最佳选择,但似乎你可以使用以下方法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
Run Code Online (Sandbox Code Playgroud)

  • [博士 输出或:我如何学会停止担心和爱MERGE](http://sqlblog.com/blogs/adam_machanic/archive/2009/08/24/dr-output-or-how-i-learned-to-stop -worrying和爱最merge.aspx) (4认同)
  • 这是一篇很棒的文章.但是,对您的问题的简短回答是MERGE允许在单个语句中组合INSERT,UPDATE和DELETE的任意组合(此代码强制执行INSERT).MERGE对您有用,因为它允许使用OUTPUT子句中不同表的列,而INSERT则不允许. (4认同)
  • @MikaelEriksson或[Dr.]的新链接 输出或:我如何学会停止担忧和喜欢MERGE](http://dataeducation.com/dr-output-or-how-i-learned-to-stop-worrying-and-love-the-merge/)如果另一个不起作用. (3认同)