Используя TSQL, результаты XQuery возвращают> 1 идентификаторов, которые мне нужно искать в запросе - PullRequest
1 голос
/ 23 сентября 2010

У меня есть столбец в БД SQL Server 2005, который содержит XML, хранящийся в виде строки.Внутри этого XML находится следующее дерево элементов

<DriverDetails>
  <DriverDetail>
    <ID>2334</ID>
    <PRN>1</PRN>
  </DriverDetail>
  <DriverDetail>
    <ID>2335</ID>
    <PRN>2</PRN>
  </DriverDetail>
  <DriverDetail>
    <ID>2336</ID>
    <PRN>3</PRN>
  </DriverDetail>
  <DriverDetail>
    <ID>2337</ID>
    <PRN>4</PRN>
  </DriverDetail>
</DriverDetails>

Я получил это, используя:

CONVERT(xml, detailRiskInformation).query('
            //DriverDetails
        ')

Мне нужно запросить каждый идентификатор в каждом узле DriverDetail, чтобы увидеть его, если он существует в другомтаблица, называемая DriverDetails.Соответствующий столбец - [DriverDetail]. [Id].

Теперь я могу запустить XQuery следующим образом:

CONVERT(xml, detailRiskInformation).query('
            for $i in //DriverDetail
            return data( $i )
        ')

Однако он просто возвращает один результат с 4 идентификаторами, разделенными пробелами.

Как выполнить итеративный запрос для каждого из этих идентификаторов в одном запросе?Или, если нет, как я могу получить их с помощью курсора или чего-то более умного?

Заранее спасибо Ant

1 Ответ

1 голос
/ 23 сентября 2010

Если вы хотите получить значения идентификатора как «TABLE» для использования в выборе, попробуйте что-то вроде этого

DECLARE @xml XML

SET @xml = '
<DriverDetails> 
  <DriverDetail> 
    <ID>2334</ID> 
    <PRN>1</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>2335</ID> 
    <PRN>2</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>2336</ID> 
    <PRN>3</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>2337</ID> 
    <PRN>4</PRN> 
  </DriverDetail> 
</DriverDetails>
'

SELECT  T.c.value('.', 'int') ID
FROM    @xml.nodes('/DriverDetails/DriverDetail/ID') T(c)

Или из столбца таблицы это будет что-то вроде

DECLARE @Table TABLE(
        XmlVal XML
)

INSERT INTO @Table
SELECT '<DriverDetails> 
  <DriverDetail> 
    <ID>2334</ID> 
    <PRN>1</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>2335</ID> 
    <PRN>2</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>2336</ID> 
    <PRN>3</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>2337</ID> 
    <PRN>4</PRN> 
  </DriverDetail> 
</DriverDetails>
'

INSERT INTO @Table
SELECT '<DriverDetails> 
  <DriverDetail> 
    <ID>1</ID> 
    <PRN>1</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>2</ID> 
    <PRN>2</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>3</ID> 
    <PRN>3</PRN> 
  </DriverDetail> 
  <DriverDetail> 
    <ID>4</ID> 
    <PRN>4</PRN> 
  </DriverDetail> 
</DriverDetails>
'


SELECT  T2.Loc.value('.', 'int') ID
FROM    @Table T
CROSS APPLY XmlVal.nodes('/DriverDetails/DriverDetail/ID') as T2(Loc) 
...