Получение данных с SQL Server с использованием xpath - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь получить некоторые данные в форме XML из базы данных, и у меня есть некоторый успех, но я, кажется, не могу отфильтровать их.

Я должен привести, потому что данные хранятся как nvarchar

select 
    cast (questions.[Text] as xml)
        .query('/table/tbody/tr/td[@data-bm="cip_3_timeframe"]') as timeframe
from 
    ODQuestions 
where 
    QuestionType = 5 

Я получаю информацию обратно.Несколько пустых строк и несколько строк с XML, который я хочу!Поэтому я попытался добавить простой

select 
    cast(questions.[Text] as xml)
       .query('/table/tbody/tr/td[@data-bm="cip_3_timeframe"]') as timeframe
from 
    ODQuestions 
where 
    QuestionType = 5 and timeframe <> ''

, и кажется, что период не является столбцом.

Я также пытался

select 
    cast (questions.[Text] as xml) as timeframe,
    timeframe.query('/table/tbody/tr/td[@data-bm="cip_3_timeframe"]') 
from 
    ODQuestions 
where 
    QuestionType = 5 
    and timeframe.exists('/table/tbody/tr/td[@data-bm="cip_3_timeframe"]')

Аналогичным образом приводил к

Msg 4121, уровень 16, состояние 1, строка 1
Не удается найти ни один столбец "таймфрейм"или пользовательская функция или агрегат" timeframe.query ", или имя неоднозначно.

Любые подсказки о том, как отфильтровать эти данные, будут очень благодарны!

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

В следующий раз это поможет предоставить (сокращенный) пример вашего XML, достаточный для того, чтобы воспроизвести вашу проблему и указать ожидаемый результат.

Если я правильно понял, вы хотите избежать пустых результатов.Вы можете попробовать один из них:

select A.Casted.query('/table/tbody/tr/td[@data-bm="cip_3_timeframe"]') as timeframe
from   ODQuestions q
cross apply
       (
          SELECT cast (q.[Text] as xml)
       ) A(Casted)
where 
    q.QuestionType = 5 
    AND A.Casted.exist('/table/tbody/tr/td[@data-bm="cip_3_timeframe"]')=1;

Или, может быть, что-то в этом

select A.Casted.query('/table
                       /tbody
                       /tr
                       /td[not(empty(.)) and @data-bm="cip_3_timeframe"]') as timeframe
from   ODQuestions q 
cross apply
       (
          SELECT cast (q.[Text] as xml)
       ) A(Casted)
where 
    q.QuestionType = 5 

Или что-то в этом

select A.Casted.query('/table
                       /tbody
                       /tr[not(empty(/td/@data-bm))]
                       /td[@data-bm="cip_3_timeframe"]') as timeframe
from   ODQuestions q 
cross apply
       (
          SELECT cast (q.[Text] as xml)
       ) A(Casted)
where 
    q.QuestionType = 5 
0 голосов
/ 21 июня 2019

Вы можете добавить тест в предикат XPath, чтобы отфильтровать пустые td элементы:

select cast (questions.[Text] as xml)
  .query('/table/tbody/tr/td[@data-bm="cip_3_timeframe"][normalize-space()]') as timeframe
   from ODQuestions 
   where QuestionType = 5 

td[normalize-space()] отфильтрует td элементов, которые являются пустыми или содержат только пробелы.

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