Я использую SQL Server 2008 и хотел бы иметь возможность использовать что-то вроде предложения mySQL ON DUPLICATE KEY UPDATE
для INSERT
операторов
Текущий унаследованный код выполняет удаление и последующую вставку, которые сталкиваются с проблемами параллелизма с дублированием вставок ключей из отдельных потоков:
Вот ошибка, которую я вижу в моей производственной среде:
Violation of PRIMARY KEY constraint 'PK_Audience'. Cannot insert duplicate key in object 'dbo.Audience'.
(sp_ContentUpdate)
Первичный ключ:
AudienceId, VersionId
Оскорбляющий SQL:
DELETE FROM dbo.Audience
WHERE VersionId = @VersionId
IF @AudienceXml IS NOT NULL
BEGIN
INSERT INTO dbo.Audience (
VersionId,
AudienceId,
CreatedDate,
CreatedByPersonId,
)
SELECT @VersionId,
AudienceId,
GETUTCDATE(),
@PersonId
FROM dbo.Audience
JOIN @AudienceXml.nodes('/Audiences/Audience') node(c)
ON Audience.AudienceName = c.value('@Name', 'nvarchar(50)')
END
Заключение этого TSQL в транзакцию, по-видимому, либо устраняет проблему параллелизма, либо маскирует проблему путем изменения времени. Тем не менее, я не думаю, что завершение транзакции фактически решило параллелизм.
Возможно, я ошибаюсь. Ваши предложения приветствуются.