Выберите имя и значение тега из Xml

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