我有一组数据,这些数据需要在表中产生新的一行。创建该行后,我需要将元数据附加到与此信息相关的单独表中。这就是我需要创建我的[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
PS背景故事。对我而言,身份只是我们将在其他系统中使用的全球ID的持有人,而不是实际的个人号码(等同于社会安全号码),这样,只有一个位置具有敏感号码,并且可以关联多个帐户标识,例如社会安全编号或AD帐户使用相同的全局ID。
PPS我宁愿避免使用游标,因为查询在第一次运行时将移动近200万条记录,每天运行几千条。
@PeterHe给了我一个如何解决这个问题的想法 MERGE
得到它的工作如下。插入所有行后,我可以查询@temp以继续其余插入。
DECLARE @temp AS TABLE(
[action] NVARCHAR(20)
,[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
)
)
MERGE [security].[Identities] AS tar
USING person AS src
ON 0 = 1 -- all rows from src need to be inserted, ive already filtered out using CTE Query.
WHEN NOT MATCHED THEN
INSERT
(
[Created], [Updated]
)
VALUES
(
GETUTCDATE(), GETUTCDATE()
)
OUTPUT $action, inserted.GlobalId, src.[Personnumber], src.[Firstname], src.[Lastname] INTO @temp;
SELECT * FROM @temp
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句