У меня есть эта таблица
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
Почему срабатывает вставка при совпадении?