【问题标题】:SQL Server : Merge and OutputSQL Server:合并和输出
【发布时间】:2022-01-19 19:42:50
【问题描述】:

我试图简化一些域逻辑,而不是单独的查询试图利用合并将单个查询文件作为资源加载到我的应用程序中。但我似乎遇到了:

合并语句与外键约束冲突

我将创建一个较小的示例来演示我的问题:

表一:“客户”

  • 身份证
  • 其他栏目...

表二:“费率”

  • 身份证
  • CustomerId
  • 其他栏目...

理论上,如果创建了客户,它应该利用为第二次合并费率创建的 ID。如果发生客户更新,则该 id 将用于第二次合并或仅使用代码中传递的参数。

DECLARE @Identifier INT;
DECLARE @CustomerAudit TABLE (
          Action NVARCHAR(MAX)
     ,    Id INT
);

MERGE INTO [web].[Customers] AS destination
USING (VALUES (@Id, @OtherColumns)) AS source (Id, OtherColumns)
      ON (@Id = destination.[Id])

WHEN NOT MATCHED 
    THEN 
        INSERT (OtherColumns) VALUES (@OtherColumns)

WHEN MATCHED 
    THEN 
        UPDATE 
        SET destination.[OtherColumns] = @OtherColumns

OUTPUT $action, inserted.[Id] INTO @CustomerAudit


SELECT @Identifier = [Id] 
FROM @CustomerAudit 
WHERE @Identifier = Id

MERGE INTO [web].[Rates] AS destination
USING (VALUES (@Id, @Customer, @OtherColumns)) AS source (Id)
      ON (@Id = destination.[Id] AND COALESCE(@Identifier, @Customer) = destination.[Customer])

WHEN NOT MATCHED 
    THEN 
        INSERT (Customer, OtherColumns) 
        VALUES (COALESCE(@Identifier, @Customer), @OtherColumns)

WHEN MATCHED 
    THEN 
        UPDATE SET destination.[OtherColumns] = @OtherColumns

OUTPUT $action, inserted.*;
DELETE FROM @CustomerAudit;

为简洁起见,其他列已被截断,但应传达意图。重点应该放在索引约束上。如果我查询@CustomerAudit(不是声明的表,而是完整的表),我可以清楚地看到插入的记录与源匹配。但第二次合并似乎有一个关键的约束问题。虽然我在表中看到了钥匙。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    看来:

    SELECT @Identifier = [Id] 
    FROM @CustomerAudit 
    WHERE @Identifier = Id
    

    应该是

    SELECT @Identifier = [Id] 
    FROM @CustomerAudit 
    WHERE Id = @Id;
    

    或者简单地从@Identfier 变量重新开始并使用@Id 代替。

    【讨论】:

    • 虽然对于插入,@Id 不会是应用程序中的零,因此找不到带有 Id 的输出记录吗?
    • @Greg 条件WHERE @Identifier = Id 会将 NULL 与始终不正确的列 ID 进行比较(实际上未知)。所以@Identifier 在这种情况下总是 NULL。
    • 我不知道,但确实有道理。
    猜你喜欢
    • 2013-10-24
    • 2022-01-22
    • 2011-11-29
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多