【问题标题】:How do I get inserted row Id, along with related data back after insert without inserting the related data如何在插入后返回插入的行 ID 以及相关数据而不插入相关数据
【发布时间】:2019-11-29 22:47:08
【问题描述】:

我有一组数据需要在表中生成一个新行。创建此行后,我需要将元数据附加到与此信息相关的单独表中。那就是我需要先创建我的[Identity],从行中取回GlobalId,然后将[Accounts][Metadata] 附加到它。

插入数据并获取插入行的 ID 非常简单(请参阅下面的查询)。但我很困惑如何将personnumberfirstnamelastname 也插入到这个临时表中,以便继续插入相关数据。

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


【解决方案1】:

@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多