2012-02-25 3 views
5

Mam strukturę xml w mojej bazy danych tak:Usuń węzeł xml z SQL Server 2008 w oparciu o wartość atrybutu

<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> 

I próbuję usunąć węzeł ContactDetails oparciu o atrybut ContactDetails id. Ale wydaje mi się, że wpadam na ceglaną ścianę.

Mój kod SP jest jak tak

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

otrzymuję żadnych błędów na stronie lub podczas debugowania/wykonywanie SP i jej po prostu doprowadza mnie do szaleństwa, dlaczego jej nie działa !!

Dzięki Tom

Odpowiedz

7

Co jest zmienna @contactID zdefiniowany jako ??

To działa na moim komputerze :-) Spróbuj tego:

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 

Powstały XML wrócę wychodzi bez tej jednej <ContactDetails> węzła.

Czy Twoja @contactID jest określona jako UNIQUEIDENTIFIER przez przypadek? Trzeba by przekonwertować do varchar - rzeczy manipulacji XML wszystko działa z ciągów ....

PS: inna sprawa Właśnie zauważyłem - to nie działa albo:

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

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

To nie działa, ponieważ operacje CAST konwertuje GUID do wielkimi literami ciąg ..... trzeba przekształcić go w dolnej przypadku znowu:

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

WTEDY znowu działa! Bardzo podchwytliwe ...

+2

DOH !! Był to unikalny identyfikator powodujący problem. Typowe było coś tak triwalnego. Dzięki, Tom –

Powiązane problemy