根据属性值从SQL Server 2008中删除xml节点

Tom*_*ton 5 xml t-sql database sql-server-2008

我的数据库中有一个xml结构,如下所示:

<ArrayOfContactDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ContactDetails id="93679d1d-9feb-45d1-8356-e85d188fa34c">
    <contactid>93679d1d-9feb-45d1-8356-e85d188fa34c</contactid>
    <contactname>Name 1</contactname>
    <contactemail>Email 1</contactemail>
    <contactphonenumber>123234234</contactphonenumber>
  </ContactDetails>
  <ContactDetails id="69f54067-edf9-414e-80b6-099ac471dc43">
    <contactid>69f54067-edf9-414e-80b6-099ac471dc43</contactid>
    <contactname>Name 2</contactname>
    <contactemail>Email 2</contactemail>
    <contactphonenumber>123234234</contactphonenumber>
  </ContactDetails>
  <ContactDetails id="93144086-be1c-4f34-a5f7-6e8ac67c2121">
    <contactid>93144086-be1c-4f34-a5f7-6e8ac67c2121</contactid>
    <contactname>Name 3</contactname>
    <contactemail>Email 3</contactemail>
    <contactphonenumber>123456</contactphonenumber>
  </ContactDetails>
</ArrayOfContactDetails>
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除基于ContactDetails id属性的ContactDetails节点.但我似乎遇到了一堵砖墙.

我的SP代码是这样的

UPDATE tableName 
SET tableField.modify('delete //ContactDetails[@id=sql:variable("@contactId")]') 
WHERE tableId = @tableId 
Run Code Online (Sandbox Code Playgroud)

我在页面上没有错误或在调试/执行sp时它只是让我疯了,为什么它不工作!

谢谢,汤姆

mar*_*c_s 8

你的@contactID变量定义为什么?

它适用于我的机器:-)试试这个:

DECLARE @work TABLE (ID INT NOT NULL, XmlContent XML)

INSERT INTO @work VALUES(1, '<ArrayOfContactDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ContactDetails id="93679d1d-9feb-45d1-8356-e85d188fa34c">
    <contactid>93679d1d-9feb-45d1-8356-e85d188fa34c</contactid>
    <contactname>Name 1</contactname>
    <contactemail>Email 1</contactemail>
    <contactphonenumber>123234234</contactphonenumber>
  </ContactDetails>
  <ContactDetails id="69f54067-edf9-414e-80b6-099ac471dc43">
    <contactid>69f54067-edf9-414e-80b6-099ac471dc43</contactid>
    <contactname>Name 2</contactname>
    <contactemail>Email 2</contactemail>
    <contactphonenumber>123234234</contactphonenumber>
  </ContactDetails>
  <ContactDetails id="93144086-be1c-4f34-a5f7-6e8ac67c2121">
    <contactid>93144086-be1c-4f34-a5f7-6e8ac67c2121</contactid>
    <contactname>Name 3</contactname>
    <contactemail>Email 3</contactemail>
    <contactphonenumber>123456</contactphonenumber>
  </ContactDetails>
</ArrayOfContactDetails>')

DECLARE @contactID VARCHAR(50) = '69f54067-edf9-414e-80b6-099ac471dc43'

UPDATE @work 
SET XmlContent.modify('delete //ContactDetails[@id=sql:variable("@contactId")]') 
where id = 1

SELECT * FROM @Work WHERE id = 1
Run Code Online (Sandbox Code Playgroud)

我得到的结果XML没有那一个<ContactDetails>节点.

@contactID被定义为UNIQUEIDENTIFIER任何机会?你必须将其转换为varchar- XML操作的东西都使用字符串....

PS:我刚注意到的另一件事 - 这也不会起作用:

DECLARE @YourOriginalContactID UNIQUEIDENTIFIER 
SET @YourOriginalContactID = '69f54067-edf9-414e-80b6-099ac471dc43'

DECLARE @ContactID VARCHAR(50)
SET @ContactID = CAST(@YourOriginalContactID AS VARCHAR(50))
Run Code Online (Sandbox Code Playgroud)

这会失败,因为CAST操作会将GUID转换为UPPERCASE字符串.....您需要再次将其转换为小写:

SET @ContactID = LOWER(CAST(@YourOriginalContactID AS VARCHAR(50)))
Run Code Online (Sandbox Code Playgroud)

然后它再次工作!相当棘手....

  • DOH !! 它是一个独特的标识符导致问题.典型的是如此琐事.谢谢,汤姆 (2认同)