T-Sql XML-запрос с пространством имен - PullRequest
7 голосов
/ 18 января 2012

Это дополнительный вопрос к

T-Sql xml query

Если я добавлю пространство имен к XML-данным, больше ничего не вернется.

DECLARE @xVar XML
SET @xVar = 
  '<ReportData ObjectId="123" xmlns="http://ait.com/reportdata">
  <ReportId>AAAA-BBBB-CCCCC-DDDDD</ReportId>
  <DocId>100</DocId>
  <ReportName>Drag Scraper Troubleshooting</ReportName>
  <DocType>Name</DocType>
  <StatusId>1</StatusId>
  <AuthorId>1</AuthorId>
   </ReportData>'

SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)') 
FROM   @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item) 

Приведенный выше запрос ничего не возвращает. Во-вторых, как мне выбрать все элементы в одном выделении и вернуть строку со всеми элементами в качестве полей?

Я хочу вернуть запись, составленную следующим образом:

ReportId              | DocId | ReportName | 
AAAA-BBBB-CCCCC-DDDDD | 100   | AAAA-BBBB-CCCCC-DDDDD |

Ответы [ 2 ]

9 голосов
/ 18 января 2012

Посмотрите на WITH XMLNAMESPACES

;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata')
SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)') 
FROM   @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item) 
1 голос
/ 18 января 2012

Если мои предположения верны и вы хотите перечислить ВСЕ элементы ReportData в своем XML-документе и хотите, чтобы их дочерние элементы были представлены в виде разных столбцов, вы можете посмотреть примерно так:

;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata')
SELECT 
    [ReportId] = reportdata.item.value('(./ReportId)[1]', 'varchar(40)') 
  , [DocId] = reportdata.item.value('(./DocId)[1]', 'varchar(40)') 
  , [ReportName] = reportdata.item.value('(./ReportName)[1]', 'varchar(40)') 
  , [DocType] = reportdata.item.value('(./DocType)[1]', 'varchar(40)') 
  , [StatusId] = reportdata.item.value('(./StatusId)[1]', 'varchar(40)') 
  , [AuthorId] = reportdata.item.value('(./AuthorId)[1]', 'varchar(40)') 
FROM @xVar.nodes('//ReportData') AS reportdata(item)

Мне понадобитсянемного позаботиться об очистке объявлений пространства имен, но мне кажется, что это работает для меня ...

РЕДАКТИРОВАТЬ: Поправил мой ответ предложением WITH XMLNAMESPACES в соответствии с рекомендациями Мартина.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...