Удалить узел XML из SQL Server 2008 на основе значения атрибута - PullRequest
5 голосов
/ 25 февраля 2012

У меня есть структура 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>

И я пытаюсь удалить узел ContactDetails на основе атрибута идентификатора ContactDetails.Но я, кажется, наталкиваюсь на кирпичную стену.

Мой SP-код выглядит примерно так:

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

Я не получаю ошибок на странице или при отладке / выполнении sp и его просто вожденияя безумен, почему это не работает !!

Спасибо, Том

1 Ответ

8 голосов
/ 25 февраля 2012

Какая переменная @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

Результирующий 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))

Это не удалось, потому что операции CAST преобразуют GUID в строку UPPERCASE ..... вам нужно снова преобразовать ее в нижний регистр:

SET @ContactID = LOWER(CAST(@YourOriginalContactID AS VARCHAR(50)))

ТО снова работает! Довольно сложно ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...