【发布时间】:2019-11-29 22:47:08
【问题描述】:
我有一组数据需要在表中生成一个新行。创建此行后,我需要将元数据附加到与此信息相关的单独表中。那就是我需要先创建我的[Identity],从行中取回GlobalId,然后将[Accounts] 和[Metadata] 附加到它。
插入数据并获取插入行的 ID 非常简单(请参阅下面的查询)。但我很困惑如何将personnumber、firstname 和lastname 也插入到这个临时表中,以便继续插入相关数据。
DECLARE @temp AS TABLE(
[GlobalId] BIGINT
,[Personnumber] NVARCHAR(100)
,[Firstname] NVARCHAR(100)
,[Lastname] NVARCHAR(100)
);
;WITH person AS
(
SELECT top 1
t.[Personnumber]
,t.[Firstname]
,t.[Lastname]
FROM [temp].[RawRoles] t
WHERE t.Personnumber NOT IN
(
SELECT i.Account FROM [security].[Accounts] i
)
)
INSERT INTO [security].[Identities] ([Created], [Updated])
-- how do i get real related values here and not my hard coded strings?
OUTPUT inserted.GlobalId, 'personnumber', 'firstname', 'lastname' INTO @temp
SELECT GETUTCDATE(), GETUTCDATE()
FROM person
附:背景故事。 对我来说,身份只是我们将使用的全球 ID 的持有者,而不是其他系统中的实际个人号码(相当于社会安全号码),这样只有一个位置有敏感号码,并且可以关联多个帐户识别,例如社会安全number 或 AD 帐户到相同的全局 id。
P.P.S 我宁愿避免使用游标,因为查询将在第一次运行时移动近 200 万条记录,每天移动数千条。
【问题讨论】:
-
尝试使用 MERGE。如果我没记错的话,MERGE 可以同时输出目标列和源列中的列
-
你可以,是的@PeterHe。例如,这个answer 显示了如何。
-
@PeterHe 感谢您的提示,使用 Merge 解决了它,如下所示。
标签: sql-server tsql