Как удалить атрибут из переменной XML в SQL Server 2008?
У меня есть таблица с именем XML (в SQL Server 2008), и она имеет поле с именем XmlDocument
типа XML
, Я пытаюсь удалить атрибут из переменной XML.
Вот как выглядит мой xml
<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>
Мой запрос
UPDATE XML
SET XmlDocument.modify('delete (/clue_personal_auto/@xmlns)[1]')
WHERE xmlid = 357
Когда я запускаю этот запрос в анализаторе запросов, я вижу сообщение "1 строка затронута", но в действительности атрибут xmlns элемента clue_personal_auto не удаляется. Есть идеи, что я делаю не так.
Спасибо BB
3 ответа
Кажется, я не могу найти простой способ сделать это - но реальный вопрос остается: почему вы хотите удалить пространство имен?? С использованием WITH XMLNAMESPACES ...
построить, вы можете легко использовать пространства имен.
Вместо того, чтобы прилагать много усилий, чтобы избавиться от него - изучите пространства имен XML и начните использовать их!
Вы можете довольно легко использовать это пространство имен XML в своих запросах:
;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
и быть счастливым с этим - не нужно искусственно удалять xmlns=
декларации больше!
Вам необходимо использовать WITH xmlnamespaces, в противном случае "/clue_personal_auto" не соответствует NAMESPACED clue_personal_auto xmlns="..."
узел.
Более того, вы не можете удалить пространство имен, поскольку оно не является нормальным атрибутом.
Пример удаления обычного атрибута
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
UPDATE XML
SET CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlDocument), N' xmlns=...'))
WHERE ID = 357