2015-01-06 3 views
0

У меня есть источник данных 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 

Это, очевидно, не будет работать, так как выбирает большое количество идентификационных номеров.

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

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

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

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

+1

Почему бы не использовать слияние с опцией удаления, а затем вставить, как вы сейчас делаете? вы хотите обе операции в одном sql, какую-то конкретную причину, которую вы хотели сделать одним выстрелом? – radar

ответ

0

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

MERGE [main-entry] as Dest 
USING (select * from #TempTable 
     ) as Source 
on Dest.[id-number] = Source.[id-number] 
WHEN MATCHED 
    THEN DELETE 
+0

Извините, пожалуйста, просмотрите обновленный вопрос. Я не могу использовать 'MERGE', потому что мне нужно его также« INSERT ». Я пробовал, и это не сработает. Это не позволяет мне использовать код «INSERT», и после удаления его не выполняется часть 'WHEN NOT MATCHED THEN'. –

+0

Кроме того, я считаю, что SQL Server не позволит 'Dest.id-number', и вместо этого ему потребуется' Dest. [Id-number] '. Я мог ошибаться, но это не позволяет мне использовать тире за пределами этих скобок. –

+0

Вскоре после того, как вы отправили это сообщение, я сказал себе: «Но я это пробовал!», Тогда я понял, что не пытался закрыть утверждение после того, как «КОГДА СООТВЕТСТВУЕТ ТОЛЬКО УДАЛИТЬ», добавив точку с запятой, чтобы ее закончить («КОГДА СОГЛАСЕН ТОГДА УДАЛИТЬ! 'Спасибо тонну! –

 Смежные вопросы

  • Нет связанных вопросов^_^