【发布时间】: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