#xml #sql-server-2008
Вопрос:
с помощью запроса в Sql Server 2008 я хотел бы извлечь имя тега и значение тега из xml, но я могу получить только значение тега. Я хотел бы извлечь их динамически, потому что имена тегов могут измениться
любая помощь будет признательна
Это и есть код:
DECLARE @test AS XML=' lt;propertiesgt; lt;property key="FirstProp"gt;Blahlt;/propertygt; lt;property key="SecondProp"gt;Blah2lt;/propertygt; lt;property key="ThirdProp"gt;Blah3lt;/propertygt; lt;property key="Other"gt;80000011blt;/propertygt; lt;property key="Another"gt;TheEndlt;/propertygt; lt;property key="MoreDIfficult"gt; lt;structure type=""gt; lt;property key="Id"gt;10100lt;/propertygt; lt;property key="Name"gt;TestNamelt;/propertygt; lt;/structuregt; lt;/propertygt; lt;/propertiesgt; '; SELECT PROPERTY.N.value('local-name(.)', 'varchar(max)') AS TagName ,PROPERTY.N.value('.', 'nvarchar(100)') AS TagValue FROM (SELECT CAST(@test AS XML) Prop ) XML OUTER APPLY XML.Prop.nodes('/properties/*') AS PROPERTY(N);
Комментарии:
1. Что вы подразумеваете под «именем тега»? Это, похоже, работает правильно и возвращается
'property'
вTagName
столбце.2. Примечание: SQL Server 2008 полностью не поддерживался в течение примерно 2,5 лет. Настоятельно рекомендуется выполнить обновление до поддерживаемой версии. Чем дольше вы этого не делаете, тем сложнее становится перейти на поддерживаемую версию.
3. Пожалуйста, отредактируйте свой вопрос и добавьте желаемый результат .
Ответ №1:
Пожалуйста, попробуйте следующее решение.
Он извлекает любой XML-элемент, имеющий конечный дочерний узел, в виде текста.
SQL
DECLARE @test AS XML= N'lt;propertiesgt; lt;property key="FirstProp"gt;Blahlt;/propertygt; lt;property key="SecondProp"gt;Blah2lt;/propertygt; lt;property key="ThirdProp"gt;Blah3lt;/propertygt; lt;property key="Other"gt;80000011blt;/propertygt; lt;property key="Another"gt;TheEndlt;/propertygt; lt;property key="MoreDIfficult"gt; lt;structure type=""gt; lt;property key="Id"gt;10100lt;/propertygt; lt;property key="Name"gt;TestNamelt;/propertygt; lt;/structuregt; lt;/propertygt; lt;/propertiesgt;'; SELECT N.value('local-name(.)', 'varchar(max)') AS TagName , N.value('@*[1]', 'varchar(max)') AS Attr , N.value('text()[1]', 'nvarchar(100)') AS TagValue FROM (SELECT CAST(@test AS XML) Prop ) XML OUTER APPLY XML.Prop.nodes('/properties//*[text()]') AS PROPERTY(N);
Выход
---------- ------------ ----------- | TagName | Attr | TagValue | ---------- ------------ ----------- | property | FirstProp | Blah | | property | SecondProp | Blah2 | | property | ThirdProp | Blah3 | | property | Other | 80000011b | | property | Another | TheEnd | | property | Id | 10100 | | property | Name | TestName | ---------- ------------ -----------