Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка из таблицы, где последний столбец - XML?  [new]
Santa89
Member

Откуда:
Сообщений: 1480
Есть таблица

DECLARE @T TABLE
(
Name varchar(20),
Age int,
XData xml
)

INSERT INTO @T
SELECT 'Vasya',20,
'
<SurveyResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <QuestionResponses>
    <QuestionResponse>
      <Id>0</Id>
      <CustomerSurveyId>5191dd09-34a5-4a70-af4b-30f44008b78f</CustomerSurveyId>
      <QuestionId>4</QuestionId>
      <Rate>2</Rate>
      <Comment>MY COMMENT</Comment>
      <Answers>
        <QuestionResponseAnswer>
          <QuestionResponseId>0</QuestionResponseId>
          <AnswerId>3</AnswerId>
        </QuestionResponseAnswer>
        <QuestionResponseAnswer>
          <QuestionResponseId>0</QuestionResponseId>
          <AnswerId>8</AnswerId>
        </QuestionResponseAnswer>
      </Answers>
    </QuestionResponse>
  </QuestionResponses>
</SurveyResponse>
'

SELECT * FROM @T


Помогите пож-ста вытащить поля QuestionId, Rate и Comment
Я пробовал через query('.').value.. но правды так и не добился, показывает пустоту
25 янв 16, 15:30    [18726457]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Santa89
Я пробовал через query('.').value.. но правды так и не добился, показывает пустоту

И где ваши пробы ?
25 янв 16, 15:31    [18726466]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
Santa89
Member

Откуда:
Сообщений: 1480
Glory,

вот пытаюсь так вытащить [QuestionId] (как третье поле в разделе QuestionRespons):
SELECT
Name,
Age,
XData.query('.').value('(QuestionResponses/QuestionResponse)[3]', 'varchar(100)')
FROM @T
25 янв 16, 15:35    [18726497]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
SELECT * , 
XData.value( '(SurveyResponse/QuestionResponses/QuestionResponse/QuestionId)[1]', 'int' ) as QuestionId,
XData.value( '(SurveyResponse/QuestionResponses/QuestionResponse/Rate)[1]', 'int' ) as Rate,
XData.value( '(SurveyResponse/QuestionResponses/QuestionResponse/Comment)[1]', 'nvarchar(200)' ) as Comment
FROM @T
25 янв 16, 15:37    [18726509]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
Santa89
Member

Откуда:
Сообщений: 1480
Crimean,

большое спасибо.
Скажите пож-ста, а можно ли как то вытащить нужные мне поля только там, где QuestionId = 4?
25 янв 16, 15:40    [18726541]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
guuuest
Guest
Santa89
Crimean,

большое спасибо.
Скажите пож-ста, а можно ли как то вытащить нужные мне поля только там, где QuestionId = 4?


М.б. так:
...
where XData.exist('SurveyResponse/QuestionResponses/QuestionResponse[QuestionId="4"]') = 1
25 янв 16, 15:57    [18726655]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
Santa89
Member

Откуда:
Сообщений: 1480
guuuest, я думал без where как то можно..

Еще такой вопрос, если мы в XML добавим еще две<QuestionResponses>, при этом у второй <QuestionResponse>, которая будет стоять посередине не будет элемента <Comment>, он будет только у первой строи и у последней.
Почему тогда, если делать выборку

SELECT XData.value( '(SurveyResponse/QuestionResponses/QuestionResponse/Comment)[1]', 'nvarchar(200)' ) as Comment FROM @T


получим последний непустой коммент, следуюший за строкой [1], почему не возвращает пусто? Ведь <Comment> у второй строки отсутствует!
25 янв 16, 16:03    [18726700]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
Santa89
Member

Откуда:
Сообщений: 1480
Извиняюсь, выборку
SELECT XData.value( '(SurveyResponse/QuestionResponses/QuestionResponse/Comment)[2]', 'nvarchar(200)' ) as Comment FROM @T
, т.е. обратимся ко второй строке у которой отсутствует тег <Comment>
25 янв 16, 16:04    [18726713]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
может как-то так:

select *,

q.value( '(QuestionResponse/QuestionId)[1]', 'int' ) as QuestionId,
q.value( '(QuestionResponse/Rate)[1]', 'int' ) as Rate,
q.value( '(QuestionResponse/Comment)[1]', 'nvarchar(200)' ) as Comment

from
(
SELECT 
* 
,
XData.query('SurveyResponse/QuestionResponses/QuestionResponse[QuestionId="4"]') as q
FROM @T
) as x
25 янв 16, 16:04    [18726715]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы, где последний столбец - XML?  [new]
Santa89
Member

Откуда:
Сообщений: 1480
Crimean,

то что надо! благодарю!
25 янв 16, 16:08    [18726737]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить