Как извлечь значение узла XML?

Я пытаюсь создать функцию SQL, которая возвращает разделенные запятыми значения всех месяцев, которые имеют значение true, читая xmlNode.

Однако я вообще не могу перейти к узлу месяцев.

Добавление пространства имен к пути не помогло мне извлечь значение из Node.Data.

Для первого узла (StartDateTime) мне удалось извлечь значение в аналогичных строках (используя путь как

/ScheduleDefinition/StartDateTime

Пожалуйста, обратитесь к коду ниже:

CREATE FUNCTION [dbo].[GetMonthsFromXML] 
(
    -- Add the parameters for the function here
    @xmlText NTEXT
)
RETURNS VARCHAR(MAX)
AS
BEGIN
/*
<ScheduleDefinition>
<StartDateTime>04/10/2019 06:00:00</StartDateTime>
<MonthlyRecurrence xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/03/01/ReportServer">
<Days>29</Days>
<MonthsOfYear>
<January>true</January>
<February>false</February>
<March>true</March>
<April>true</April>
<May>false</May>
<June>false</June>
<July>false</July>
<August>false</August>
<September>false</September>
<October>false</October>
<November>false</November>
<December>false</December>
</MonthsOfYear>
</MonthlyRecurrence>
</ScheduleDefinition>
*/
DECLARE @resultVar VARCHAR(MAX)
DECLARE @x xml
SET @x = CAST(@xmlText AS XML); 


;with cte 
as
(
SELECT 
    [MonthName] = Node.Data.value('local-name(.)', 'VARCHAR(20)')
    ,MonthValue = Node.Data.value('(.)[1]', 'VARCHAR(20)') 
FROM    
    @x.nodes('/ScheduleDefinition/MonthlyRecurrence/MonthsOfYear') Node(Data) 
 )
 select @resultVar = ISNULL( MAX(MonthValue),'') from cte; --where MonthValue is not null and MonthValue <> ''   ;

-- Return the result of the function
RETURN @resultVar

END
GO

Январь, март, апрель — ожидаемый результат для приведенного выше xml.


person Madan Prabhakara    schedule 17.04.2019    source источник


Ответы (1)


См. https://docs.microsoft.com/en-us/sql/relational-databases/xml/add-namespaces-to-queries-with-with-xmlnamespaces?view=sql-server-2017, поэтому в соответствии с

WITH XMLNAMESPACES ( 'http://schemas.microsoft.com/sqlserver/reporting/2010/03/01/ReportServer' as rs)

SELECT 
    [MonthName] = Node.Data.value('local-name(.)', 'VARCHAR(20)')
    ,MonthValue = Node.Data.value('string(.)', 'VARCHAR(20)') 
FROM    
    @x.nodes('/ScheduleDefinition/rs:MonthlyRecurrence/rs:MonthsOfYear/rs:*[. = "true"]') Node(Data)
person Martin Honnen    schedule 17.04.2019
comment
Спасибо за решение и ссылку на документацию. Я узнал совсем немного. Однако я столкнулся с другой проблемой, и я не могу заставить свою голову работать над этим. Поскольку существует несколько определений XML, я пытаюсь передать путь на основе типа повторения: например: x.nodes('sql:variable(@path)') Node(data), где @path содержит разные значения pathValues. Однако, похоже, это не работает - person Madan Prabhakara; 18.04.2019
comment
@MadanPrabhakara, задайте новый вопрос с необходимыми деталями и соответствующими тегами (например, sql-server). - person Martin Honnen; 18.04.2019