使用XQuery匹配现有记录,如果找到则删除该记录?

Using XQuery to match existing records, and then delete said record if found?

我使用 XQuery 将 XML 数据源存储在临时 Table 中,并已成功将其插入到数据库中。

我的问题是我不知道如何根据语句先检查某物是否存在,然后将其删除。这是插入代码:

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记录。 (插入代码完成)

我确实有一个关于 id-number 的唯一索引,所以如果该号码已经存在,它不允许我插入任何其他内容。所以,我认为处理这个问题的最好方法是删除上述记录。

我试过 MERGE 语句,但我无法将 INSERT 代码添加到 WHEN MATCHED THEN,因此我必须运行查询两次才能插入。 WHEN MATCHED THEN DELETE 有效,但不允许我插入其他记录。

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

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