Использование XQuery для сопоставления существующих записей, а затем удалить упомянутую запись, если найден?

У меня есть источник данных XML, хранящийся во временной таблице с использованием XQuery, и я успешно вставил его в базу данных.

Моя проблема в том, что я не знаю, как сначала проверить, существует ли что-то, а затем удалить это, основываясь на утверждении. Вот код вставки:

SELECT
    N.value('id-number[1]', 'VARCHAR(10)') as IdNumber,
    N.value('irrelevant1[1]', 'VARCHAR(12)') as Irrelevant1,
    N.value('irrelevant2[1]', 'VARCHAR(14)') as Irrelevant2,
    N.value('irrelevant3[1]', 'VARCHAR(16)') as Irrelevant3,
    N.value('irrelevant4[1]', 'VARCHAR(18)') as Irrelevant4,
    N.value('irrelevant5[1]', 'VARCHAR(20)') as Irrelevant5,
INTO #TempTable
FROM @xml.nodes('nodes/here') AS X(N)
INSERT INTO [main-entry] SELECT * FROM #TempTable

Теперь, что я хочу сделать перед вставкой, это выяснить, действительно ли эта запись основана на id-number, существует в базе данных. Если он существует, то удалите его. Оно имеет CASCADE DELETE опция для дочерних записей, поэтому они также должны быть удалены вместе с основной записью записи.

Вот что я использую:

IF (SELECT IdNumber FROM #TempTable)  IN (SELECT [id-number] FROM [main-entry]) 
    BEGIN
        DELETE FROM [main-entry] WHERE [id-number] = ''
    END

Это явно не сработает, так как оба выбирают большое количество id-номеров.

Как мне это сделать?

  1. Если id-номер существует как в основной таблице, так и в #TempTable, DELETE Это.
  2. Если он не существует в обоих, INSERT записей. (вставить код закончен)

У меня есть уникальный индекс по id-номеру, поэтому он не позволит мне вставить что-либо еще, если этот номер уже существует. Итак, я решил, что лучший способ справиться с этим - удалить указанную запись.

Я пробовал MERGE утверждение, но я не могу добавить INSERT код для WHEN MATCHED THEN, поэтому я должен был бы выполнить запрос дважды, чтобы вставить. WHEN MATCHED THEN DELETE Работает, но не позволяет мне вставлять дополнительные записи.

1 ответ

Решение

Вы можете использовать MERGE, чтобы удалить записи, а затем использовать существующий код для вставки.

MERGE [main-entry] as Dest
USING ( select * from #TempTable 
        ) as Source
on Dest.[id-number] = Source.[id-number]
WHEN MATCHED
   THEN DELETE
Другие вопросы по тегам