Оператор слияния выполняет unmatch, даже если он соответствует - PullRequest
0 голосов
/ 04 августа 2020

У меня есть эта таблица

CREATE TABLE [dbo].[Book]
(
    [PrimaryAuthorId] INT,
    [AssociatedAuthorId] INT,
    [Description] nvarchar(50),
    [FromDate] DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL CONSTRAINT [DF_Book_FromDate] DEFAULT SYSUTCDATETIME(),
    [ToDate] DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL CONSTRAINT [DF_Book_ToDate] DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999'),
    PERIOD FOR SYSTEM_TIME ([FromDate], [ToDate]),
    CONSTRAINT [PK_AuthorsBook] PRIMARY KEY ([PrimaryAuthorId], [AssociatedAuthorId]),
    CONSTRAINT [FK_PrimaryAuthorId_AuthorId] FOREIGN KEY ([PrimaryAuthorId]) REFERENCES [dbo].[Authors]([AuthorId]),
    CONSTRAINT [FK_AssociateAuthorId_AuthorId] FOREIGN KEY ([AssociatedAuthorId]) REFERENCES [dbo].[Authors]([AuthorId]),
) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.[BookHistory]));

Я создал spw с оператором слияния, который обновляется при сочетании уже существует, пока он вставляется, когда комбинация не существует. Это делается для 2 комбинаций и

Он имеет этот код

declare @PrimaryAuthorId INT =16
declare @AssociatedAuthorId INT =45
declare @Description nvarchar(50)

DECLARE @Book TABLE 
(
    [PrimaryAuthorId] INT,
    [AssociatedAuthorId] INT,
    [Description] nvarchar(50),
)

INSERT INTO @Book([PrimaryAuthorId], [AssociatedAuthorId], [Description]) VALUES(@PrimaryAuthorId, @AssociatedAuthorId)

MERGE   [dbo].Book D
USING   (
    SELECT [PrimaryAuthorId]
            ,[AssociatedAuthorId]
            ,[EndDate]
            ,@UpdatedBy
    FROM
            @AuthorAssociation
    ) S
    (
            [PrimaryAuthorId]
            ,[AssociatedAuthorId]
            ,[EndDate]
            ,[UpdatedBy]
    )
ON D.[PrimaryAuthorId] = S.[PrimaryAuthorId] AND D.[AssociatedAuthorId] = S.[AssociatedAuthorId]
WHEN    MATCHED THEN
    UPDATE  SET
        D.[PrimaryAuthorId] = S.[PrimaryAuthorId],
        D.[AssociatedAuthorId] = S.[AssociatedAuthorId],
        D.[EndDate] = S.[EndDate],
        D.[UpdatedBy] = S.[UpdatedBy]
WHEN NOT MATCHED THEN
    INSERT 
    (
        [PrimaryAuthorId]
        ,[AssociatedAuthorId]
        ,[StartDate]
        ,[EndDate]
    )
    VALUES
    (
        @PrimaryAuthorId
        ,@AssociatedAuthorId
        ,@StartDate
        ,@EndDate
    );

MERGE   [dbo].Book D
USING   (
    SELECT [PrimaryAuthorId]
            ,[AssociatedAuthorId]
            ,[EndDate]
            ,@UpdatedBy
    FROM
            @AuthorAssociation
    ) S
    (
            [PrimaryAuthorId]
            ,[AssociatedAuthorId]
            ,[EndDate]
            ,[UpdatedBy]
    )
ON D.[PrimaryAuthorId] = S.[AssociatedAuthorId] AND D.[AssociatedAuthorId] = S.[PrimaryAuthorId]
WHEN    MATCHED THEN
    UPDATE  SET
        D.[PrimaryAuthorId] = S.[PrimaryAuthorId],
        D.[AssociatedAuthorId] = S.[AssociatedAuthorId],
        D.[EndDate] = S.[EndDate],
        D.[UpdatedBy] = S.[UpdatedBy]
WHEN NOT MATCHED THEN
    INSERT 
    (
        [PrimaryAuthorId]
        ,[AssociatedAuthorId]
        ,[StartDate]
        ,[EndDate]
    )
    VALUES
    (
        @AssociatedAuthorId
        ,@PrimaryAuthorId
        ,@StartDate
        ,@EndDate
    );

Он работает при первом запуске, который вставляет 2 записи комбинации авторизованных

Проблема в том, когда я запускаю то же самое снова, я ожидаю, что он запустит обновление, поскольку есть соответствующая запись, но, похоже, выдает мне эту ошибку во втором операторе слияния

Нарушение ограничения PRIMARY KEY PK_AuthorsBook

Почему срабатывает вставка при совпадении?

...