【发布时间】:2015-01-06 18:36:57
【问题描述】:
我有一个使用 XQuery 存储在临时表中的 XML 数据源,并且已成功将其插入到数据库中。
我的问题是我不知道如何先检查是否存在某些内容,然后根据该语句将其删除。这是插入代码:
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 号。
我该怎么做?
- 如果主表和#TempTable 中都存在 id-number,
DELETE它。 - 如果两者都不存在,
INSERT记录。 (插入代码完成)
我在 id-number 上确实有一个唯一索引,因此如果该编号已经存在,它不会允许我插入任何其他内容。因此,我认为处理此问题的最佳方法是删除所述记录。
我尝试了MERGE 语句,但我无法将INSERT 代码添加到WHEN MATCHED THEN,因此我必须运行两次查询才能插入。 WHEN MATCHED THEN DELETE 确实有效,但它不允许我插入其他记录。
【问题讨论】:
-
为什么不使用删除选项合并,然后像现在一样插入?您是否希望在一个 sql 中执行两个操作,您想一次性完成的任何具体原因?
标签: sql-server xml xquery-sql