Использование 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-номеров.
Как мне это сделать?
- Если id-номер существует как в основной таблице, так и в #TempTable,
DELETE
Это. - Если он не существует в обоих,
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