2012-02-25 16 views
5

que tiene una estructura XML en mi base de datos de este modo:nodo XML Eliminar en SQL Server 2008 basado en el valor del atributo

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

Y estoy tratando de eliminar un nodo Detalles contacto basado en el atributo ID Detalles contacto. Pero parece que estoy corriendo hacia una pared de ladrillos.

Mi código SP es como tan

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

consigo ningún error en la página o cuando la depuración/ejecutar el sp y su simplemente volviendo loco de por qué no su trabajo !!

Gracias, Tom

Respuesta

7

¿Cuál es su variable de @contactID define como ??

Funciona en mi máquina :-) Prueba esto:

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 

El XML resultante regrese sale sin que uno <ContactDetails> nodo.

¿Está su @contactID definido como UNIQUEIDENTIFIER por casualidad? Habría que convertir eso a un varchar - la materia manipulación XML todos los trabajos con cuerdas ....

PS: otra cosa que me di cuenta - esto no va a funcionar bien:

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

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

esto falla porque las operaciones CAST convierte el GUID en una cadena MAYÚSCULAS ..... que necesita para convertirlo en minúsculas nuevo:

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

ENTONCES ¡funciona de nuevo! Muy complicado ...

+2

DOH !! Era un identificador único que causaba un problema. Típico era algo tan trival. Gracias, Tom –

Cuestiones relacionadas