Примечание : Этот ответ будет работать только с SQL Server 2008 ...
Используйте оператор MERGE
. Преимущество оператора MERGE
заключается в том, что оно явно выражает намерение вставить, только если совпадение еще не найдено. Для будущих читателей это может быть полезно, поскольку альтернативы, включающие INSERT .. SELECT
, немного сложнее расшифровать.
-- This is where you're "merging" data into
MERGE INTO nol_art_izm dst
-- This is your merge data source
USING (
-- Use DISTINCT here, to prevent possible duplicates from the below INNER JOIN
SELECT DISTINCT v.id_art
FROM openxml(@hDoc, '/art_kompl/nol_voac') with #vc xd
INNER JOIN nol_voac v on xd.id_art = v.id_art
) src
-- This is your "join" condition, used to decide whether to perform an
-- INSERT or UPDATE
ON (dst.art_id = src.id_art)
-- When source and target don't match (see ON clause), perform an insert
WHEN NOT MATCHED THEN INSERT ([ART_ID],[DAT])
VALUES (src.id_art, {fn now()})
В этом утверждении пропущено предложение WHEN MATCHED THEN UPDATE
, поскольку вы заинтересованы только в выполнении INSERTs
, а не UPDATEs