使用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 号码。
我该怎么做?
- 如果主表和 #TempTable 中都存在 id-number,
DELETE
它。
- 如果两者都不存在,则
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
我使用 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 号码。
我该怎么做?
- 如果主表和 #TempTable 中都存在 id-number,
DELETE
它。 - 如果两者都不存在,则
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