方案:我正在使用如下所示的upsert存储过程将数据从Azure表存储复制到Azure SQL数据库:
CREATE PROCEDURE [dbo].[upsertCustomer] @customerTransaction dbo.CustomerTransaction READONLY
AS
BEGIN
MERGE customerTransactionstable WITH (HOLDLOCK) AS target_sqldb
USING @customerTransaction AS source_tblstg
ON (target_sqldb.customerReferenceId = source_tblstg.customerReferenceId AND
target_sqldb.Timestamp = source_tblstg.Timestamp)
WHEN MATCHED THEN
UPDATE SET
AccountId = source_tblstg.AccountId,
TransactionId = source_tblstg.TransactionId,
CustomerName = source_tblstg.CustomerName
WHEN NOT MATCHED THEN
INSERT (
AccountId,
TransactionId,
CustomerName,
CustomerReferenceId,
Timestamp
)
VALUES (
source_tblstg.AccountId,
source_tblstg.TransactionId,
source_tblstg.CustomerName,
source_tblstg.CustomerReferenceId,
source_tblstg.Timestamp
);
END
GO
其中 customerReferenceId 和 Timestamp 构成 CustomerTransactionstable
的组合键但是,当我更新源(Azure表)中的行并重新运行Azure数据工厂时,会看到此错误:
“ ErrorCode = FailedDbOperation,'Type = Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message = A 数据库操作失败,并出现以下错误:'违反 主键约束'PK_CustomerTransactionstable'。 无法在对象中插入重复键 'dbo.CustomerTransactionstable'。重复的键值为 (1990年12月31日,上午12:49,ABCDEFGHIGK)。\ r \ n声明已 已终止。',Source = .Net SqlClient数据 Provider,SqlErrorNumber = 2627,Class = 14,ErrorCode = -2146232060,State = 1,Errors = [{Class = 14,Number = 2627,State = 1,Message =违反 KEY约束'PK_CustomerTransactionstable'的结果“”
现在,我已验证源和接收器中只有一行具有匹配的主键,唯一的区别是源行中的某些列已更新。
Azure文档中的此{{3}}涉及可重复复制,但是我不想在插入任何数据之前从目的地删除该时间段内的行,也不能添加新的sliceIdentifierColumn到我现有的表或任何架构更改。
问题:
修改:
此问题现已解决。
解决方案:
仅在试图插入主键时才会发生主键冲突 记录已具有匹配的主键。就我而言 尽管水槽里只有一个记录,但条件是 合并由于不匹配而无法满足 在 datetime 和 datetimeoffset 字段之间。
答案 0 :(得分:0)
您是否尝试过将ADF数据流与映射数据流一起使用,而不是通过SPROC对其进行编码?对于使用SQL的专家来说,它可能要容易得多。
通过Alter Row转换,您可以通过UI设置执行Upsert,Update,Delete,Insert并选择PK:https://docs.microsoft.com/en-us/azure/data-factory/data-flow-alter-row
您仍然只需要在“数据流”活动之前执行“复制”活动即可从表存储中复制数据。将其放在Blob文件夹中,然后数据流可以从中读取源。