2011-03-17 12 views
6

Tengo una tabla llamada XML (en SQL Server 2008) y tiene un campo llamado XmlDocument del tipo XML. Estoy tratando de eliminar un atributo de una variable XML.Cómo eliminar un atributo de una variable XML en sql server 2008?

Aquí es cómo mi xml parece

<clue_personal_auto xmlns="http://cp.com/rules/client"> 
    <admin> 
    <receipt_date>03/16/2011</receipt_date> 
    <date_request_ordered>03/16/2011</date_request_ordered> 
    <report_usage>Personal</report_usage> 
    </admin> 
</clue_personal_auto> 

Mi consulta

UPDATE XML 
SET XmlDocument.modify('delete (/clue_personal_auto/@xmlns)[1]') 
WHERE xmlid = 357 

Cuando ejecuto esta consulta en el analizador de consultas veo el mensaje "1 fila (s) afectada", pero en realidad el atributo xmlns del elemento clue_personal_auto no se está eliminando. Alguna idea de que estoy haciendo mal

Gracias BB

+2

(1 fila afectada) simplemente significa que realizó una actualización. Si hubiera una columna de marca de tiempo, habría cambiado. Del mismo modo que 'update tbl set id = id' también tiene éxito, pero no hace nada – RichardTheKiwi

+0

Tenga en cuenta que la función SQL-Server' .modify() 'utiliza el [XML Data Modification Language] de un proveedor (http://msdn.microsoft.com/ en-us/library/ms177454.aspx) –

Respuesta

2

Me parece que no puede encontrar una manera fácil de hacer esto - pero la verdadera pregunta sigue siendo: ¿por qué qué quieres eliminar el espacio de nombres ?? Con el constructo WITH XMLNAMESPACES ..., puede hacer uso fácilmente de los espacios de nombres.

En lugar de esforzarse mucho para deshacerse de ella, ¡aprenda sobre espacios de nombres XML y empiece a usarlos!

Se puede utilizar con bastante facilidad ese espacio de nombres XML en sus consultas:

;WITH XMLNAMESPACES (DEFAULT 'http://cp.com/rules/client') 
SELECT 
    XmlDocument.value('(/clue_personal_auto/admin/report_usage)[1]', 'varchar(25)') 
FROM XML 
WHERE ID = 357 

y ser feliz con ella - no hay necesidad de eliminar artificialmente xmlns= declaraciones más!

+0

Gracias Marc_s, eso ayuda y funcionó .. :-) – BumbleBee

+1

Una razón para deshacerse de los espacios de nombres es cuando rompen un montón de código heredado que nunca antes había tenido que trabajar con ellos. En mi aplicación, los espacios de nombres no sirven para nada (excepto para hacer que los comandos existentes de XPath dejen de funcionar). –

4

Es necesario utilizar WITH xmlnamespaces, de lo contrario "/ clue_personal_auto" no coincide con el nodo de espacio de nombres clue_personal_auto xmlns="...".

No solo eso, no se puede eliminar un espacio de nombres dado que no es un atributo normal.

Ejemplo de eliminar un atributo regular

declare @xml table (xmlid int, xmldocument xml) 
insert @xml select 357, ' 
<clue_personal_auto xmlns="http://cp.com/rules/client" otherattrib="x"> 
    <admin> 
    <receipt_date>03/16/2011</receipt_date> 
    <date_request_ordered>03/16/2011</date_request_ordered> 
    <report_usage>Personal</report_usage> 
    </admin> 
</clue_personal_auto>' 

;WITH XMLNAMESPACES ('http://cp.com/rules/client' as ns) 
UPDATE @XML 
SET XmlDocument.modify('delete (/ns:clue_personal_auto/@otherattrib)[1]') 
WHERE xmlid = 357 

select * from @xml 
+0

Gracias Richard, es maravilloso. – BumbleBee

4
UPDATE XML 
    SET CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlDocument), N' xmlns=...')) 
WHERE ID = 357 
+0

Agradable: ¡fuerza bruta pero efectiva! –

Cuestiones relacionadas