У меня есть источник данных XML, который хранится во временной таблице с помощью XQuery и успешно вставил его в базу данных.Использование 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-number существует как в основной таблице, так и в #TempTable,
DELETE
. - Если он не существует в обоих случаях,
INSERT
записей. (код вставки закончен)
У меня есть уникальный индекс на id-number, поэтому он не позволит мне вставлять что-либо еще, если это число уже существует. Итак, я решил, что лучший способ справиться с этим - удалить указанную запись.
Я пробовал оператор MERGE
, но я не могу добавить INSERT
код в WHEN MATCHED THEN
, поэтому мне пришлось бы дважды выполнить запрос для вставки. WHEN MATCHED THEN DELETE
Работает, но это не позволяет мне вставлять дополнительные записи.
Почему бы не использовать слияние с опцией удаления, а затем вставить, как вы сейчас делаете? вы хотите обе операции в одном sql, какую-то конкретную причину, которую вы хотели сделать одним выстрелом? – radar