【问题标题】:Using XQuery to match existing records, and then delete said record if found?使用 XQuery 匹配现有记录,如果找到则删除所述记录?
【发布时间】: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 号。

我该怎么做?

  1. 如果主表和#TempTable 中都存在 id-number,DELETE 它。
  2. 如果两者都不存在,INSERT 记录。 (插入代码完成)

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

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

【问题讨论】:

  • 为什么不使用删除选项合并,然后像现在一样插入?您是否希望在一个 sql 中执行两个操作,您想一次性完成的任何具体原因?

标签: sql-server xml xquery-sql


【解决方案1】:

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

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

【讨论】:

  • 抱歉,请查看更新后的问题。我不能使用MERGE,因为我还需要INSERT。我试过了,它不起作用。它不允许我使用INSERT 代码,并且删除后它不会执行WHEN NOT MATCHED THEN 部分。
  • 另外,我相信 SQL Server 不会允许Dest.id-number,而是需要Dest.[id-number]。我可能是错的,但它不允许我在这些括号之外使用破折号。
  • 在您发布此消息后不久,我对自己说,“但我试过了!”,然后我意识到我并没有尝试通过添加分号来终止 WHEN MATCHED THEN DELETE 之后的语句( WHEN MATCHED THEN DELETE;. 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多