2016-08-22 5 views
0

Я пытаюсь извлечь метаданные из XML из базы данных сервера отчетов SQL Server. Мой текущий запрос приведен ниже:Как извлечь несколько значений из столбца XML, используя функцию, аналогичную функции value()?

SELECT 
a.Name as 'ReportName' 
,a.ReportXML 
,Parameter = x.value('(Parameter/Name)[1]','VARCHAR(250)') 
FROM (SELECT C.Name,c.itemID,CONVERT(XML,CONVERT(VARCHAR(MAX),C.Parameter)) AS reportXML 
     FROM ReportServer.dbo.Catalog C 
     WHERE C.Content is not null 
     and c.Type = 2 -- Report only 
    ) a 

cross apply reportXML.nodes('/Parameters') r (x) 
WHERE 1=1 
and name ='ReportName' 

Моя цель - вернуть все параметры, связанные с отчетом. Метод x.value вернет только 1 значение. (В настоящее время он возвращает первый параметр отчета, потому что 1 жестко закодирован в строковом литерале.) Я знаю, что есть 5 параметров для отчета, на который я смотрю.

Есть ли другая функция с похожим синтаксисом, которая позволит мне вернуть все значения? Или есть шаблон, который я могу использовать вместо номера? Я пробовал несколько функций на msdn без везения.

ответ

1

Ваш вопрос: nodes('/Parameters'). Это вернет набор результатов с одной строкой для каждого элемента Parameters, но есть только один.

С Parameter = x.value('(Parameter/Name)[1]','VARCHAR(250)') вы читаете первое имя первого параметра. Если есть более Parameter элементы, вложенные в Parameters вы будете читать только первый ...

Без примера вашего фактического XML это не так легко ответить, но:

Попробуйте добавить еще один уровень вложенности, добавив этот ниже ваш cross apply

outer apply r.x.nodes('Parameter') AS p (y) 

Затем измените столбец

,Parameter = y.value('Name[1]','VARCHAR(250)') 

Это следует читать фи первый Name элемент каждого элемента Parameter

Если вам нужна дополнительная помощь, пожалуйста, Poste пример вашего XML.

Btw: Я не понимаю этого:

CONVERT(XML,CONVERT(VARCHAR(MAX),C.Parameter) 

Какова начальная тип C.Parameter, что вы должны бросить его VARCHAR(MAX), а затем XML? Если вы все еще используете устаревшие TEXT, NTEXT или IMAGE, вы должны рассмотреть возможность изменить это!

+0

Спасибо! Ваше решение сработало, и вы также правильно указали, что C.Parameter является NTEXT. Из-за этого я преобразовал в varchar (max), а затем в XML. Не возражаете ли вы предоставить мне возможность изменить это из NTEXT или указать мне на какую-то документацию. – SQLUser44

+1

@ SQLUser44, [Read this] (https://msdn.microsoft.com/en-us/library/ms187993.aspx). NTEXT, TEXT и IMAGE, где уже установлен * устарел * с SQL Server 2000 (!). Microsoft завершит поддержку в одной из следующих версий. Сегодня мы используем 'NVARCHAR (MAX)', 'VARCHAR (MAX)' и 'VARBINARY (MAX)'. В вашем конкретном случае вы должны использовать тип данных 'XML'. Это будет 1) гарантировать действительный контент и 2) ускорить ваши запросы, так как вам не придется выполнять дорогостоящие трансляции больших типов. Btw: Thx для принятия. Было бы неплохо проголосовать за меня, THX! – Shnugo