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

Откуда:
Сообщений: 5
Доброго времени суток.

Есть поле в котором хранится XML документ в виде текста.
В нем хранятся ID которые необходимо вытащить и найти в другой таблице все записи с этими ID.
Нужные IDшники лежат между тегами <assessment_id> ХХХ </assessment_id>,
Сложность в том, что их может быть от 0 до бесконечности.
Подскажите как их лучше вытащить?


      <collaborator_id>6283425781660024712</collaborator_id>
    </collaborator>
    <collaborator>
      <collaborator_id>6288901487907197189</collaborator_id>
    </collaborator>
  </collaborators>
  <assessments>
    <assessment>
      <assessment_id>6358315004600729728</assessment_id>
    </assessment>
    <assessment>
      <assessment_id>6358412230051308833</assessment_id>
    </assessment>
  </assessments>
  <status_in_knowledge_map>active</status_in_knowledge_map>
  <join_mode>close</join_mode>
  <doc_info>
    <creation>
      <user_login>ushakoma</user_login>
      <user_id>6261604388938462561</user_id>
      <date>2016-06-07T16:50:40Z</date>
17 авг 17, 12:05    [20730684]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить из строки N повторяющихся значений  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
KaralTlba, то, что вы привели - это не XML.

Если сделать предположение, что это таки должен быть XML и дополнить недостающими тэгами, то выглядеть код будет примерно так:

declare @Testtable table (xml_field nvarchar(max));
insert into @Testtable
        (xml_field)
values  (N'<collaborators>
	<collaborator>
		<collaborator_id>6283425781660024712</collaborator_id>
    </collaborator>
    <collaborator>
      <collaborator_id>6288901487907197189</collaborator_id>
    </collaborator>
  </collaborators>
  <assessments>
    <assessment>
      <assessment_id>6358315004600729728</assessment_id>
    </assessment>
    <assessment>
      <assessment_id>6358412230051308833</assessment_id>
    </assessment>
  </assessments>
  <status_in_knowledge_map>active</status_in_knowledge_map>
  <join_mode>close</join_mode>
  <doc_info>
    <creation>
      <user_login>ushakoma</user_login>
      <user_id>6261604388938462561</user_id>
      <date>2016-06-07T16:50:40Z</date>
	</creation>
	</doc_info>'
         );

select	t2.assessment_id.value('text()[1]', 'nvarchar(max)')
from	(select cast(xml_field as xml) as xml_field from @Testtable) as t
		cross apply xml_field.nodes('//assessment_id') as t2(assessment_id)
17 авг 17, 12:14    [20730740]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить из строки N повторяющихся значений  [new]
KaralTlba
Member

Откуда:
Сообщений: 5
Minamoto, спасибо большое. Это должен быть XML, для краткости сообщения стал пихать весь кусок XML ки.
Еще один, наверное глупый вопрос. Как вместо явного значения Value вписать
select Поле from Таблица
where ....

Никак не могу подобрать синтаксис
17 авг 17, 14:10    [20731273]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить из строки N повторяющихся значений  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
KaralTlba, не понятно, что вы имеете в виду. Поясните подробнее, желательно с примерами.
17 авг 17, 14:11    [20731274]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить из строки N повторяющихся значений  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5982
KaralTlba
Как вместо явного значения Value вписать

Вы про этот кусок в приведённом примере?
select cast(xml_field as xml) as xml_field from @Testtable

Value() это метод объекта содержащего узлы //assessment_id из xml_field, возвращающий результат вычисления указанного xpath text()[1] в приведении к типу данных nvarchar(max)
17 авг 17, 14:42    [20731399]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить из строки N повторяющихся значений  [new]
KaralTlba
Member

Откуда:
Сообщений: 5
Minamoto,
Есть таблица Group в которой есть поле data, и поле Name соответственно в таблице много строк
В поле data лежит XML, который был в первом сообщении :

<group SPXML-FORM="x-local://wtv/wtv_group.xmd">
<id>6293447453621051999</id>
<code>dash_kapital_002</code>
<name>Капитал 2016-2017</name>
<show_detailed>false</show_detailed>
<is_dynamic>false</is_dynamic>
<is_educ>false</is_educ>
<is_hidden>false</is_hidden>
<allow_social_post>false</allow_social_post>
<collaborators>
<collaborator>
<collaborator_id>6293868526457663069</collaborator_id>
</collaborator>
....
....
....
</collaborator>
</collaborators>
<assessments>
<assessment>
<assessment_id>6358315004600729728</assessment_id>
</assessment>
<assessment>
<assessment_id>6358412230051308833</assessment_id>
</assessment>
</assessments>
<status_in_knowledge_map>active</status_in_knowledge_map>
<join_mode>close</join_mode>
<doc_info>
<creation>
<user_login>ushakoma</user_login>
<user_id>6261604388938462561</user_id>
<date>2016-06-07T16:50:40Z</date>

Нужно в поле data найти все значения Которые лежат между тегами <assessment_id> XXXXX </assessment_id>, во всех строках которые в имени содержат 'Dash'
17 авг 17, 14:46    [20731420]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить из строки N повторяющихся значений  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
KaralTlba
Minamoto,
+
Есть таблица Group в которой есть поле data, и поле Name соответственно в таблице много строк
В поле data лежит XML, который был в первом сообщении :

<group SPXML-FORM="x-local://wtv/wtv_group.xmd">
<id>6293447453621051999</id>
<code>dash_kapital_002</code>
<name>Капитал 2016-2017</name>
<show_detailed>false</show_detailed>
<is_dynamic>false</is_dynamic>
<is_educ>false</is_educ>
<is_hidden>false</is_hidden>
<allow_social_post>false</allow_social_post>
<collaborators>
<collaborator>
<collaborator_id>6293868526457663069</collaborator_id>
</collaborator>
....
....
....
</collaborator>
</collaborators>
<assessments>
<assessment>
<assessment_id>6358315004600729728</assessment_id>
</assessment>
<assessment>
<assessment_id>6358412230051308833</assessment_id>
</assessment>
</assessments>
<status_in_knowledge_map>active</status_in_knowledge_map>
<join_mode>close</join_mode>
<doc_info>
<creation>
<user_login>ushakoma</user_login>
<user_id>6261604388938462561</user_id>
<date>2016-06-07T16:50:40Z</date>


Нужно в поле data найти все значения Которые лежат между тегами <assessment_id> XXXXX </assessment_id>, во всех строках которые в имени содержат 'Dash'


Ну так в подзапросе нужные условия наложите.

select	t2.assessment_id.value('text()[1]', 'nvarchar(max)')
from	(select cast(xml_field as xml) as xml_field from @Testtable where Name like '%Dash%') as t
		cross apply xml_field.nodes('//assessment_id') as t2(assessment_id)
17 авг 17, 16:15    [20731797]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить