使用XQuery匹配现有记录,然后删除所述记录如果找到?

时间:2015-01-06 18:36:57

标签: sql-server xml xquery-sql

我有一个使用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号。

我该怎么做?

  1. 如果主表和#TempTable中都存在id-number,DELETE它。
  2. 如果两者都不存在INSERT条记录。 (插入代码已完成)
  3. 我对id-number有一个唯一的索引,因此如果该数字已经存在,它将不允许我插入任何其他内容。所以,我认为处理这个的最好方法是删除所述记录。

    我已经尝试了MERGE语句,但我无法将INSERT代码添加到WHEN MATCHED THEN,因此我必须运行两次查询才能插入。 WHEN MATCHED THEN DELETE可以使用,但不允许我插入其他记录。

1 个答案:

答案 0 :(得分:0)

您可以使用 MERGE 删除条目,然后使用现有代码进行插入。

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