powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / запрос к xml фрагменту
24 сообщений из 24, страница 1 из 1
запрос к xml фрагменту
    #36550369
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
сервер mssql2005
вопрос в следующем
я получаю извне (из vbscript) строку (фрагмент) xml формата
Код: plaintext
'<Manager><User Name="Иванофф" id="23"><Type>Куратор</Type></User><User Name="Петрофф" id="11"><Type>Менеджер</Type></User><User Name="Сидорофф" id="75"><Type>Менеджер</Type></User></Manager>'
более наглядно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select convert (xml,'<Manager>...
<Manager>
  <User Name="Иванофф" id="23">
    <Type>Куратор</Type>
  </User>
  <User Name="Петрофф" id="11">
    <Type>Менеджер</Type>
  </User>
  <User Name="Сидорофф" id="75">
    <Type>Менеджер</Type>
  </User>
</Manager>
не подскажите как ОДНИМ запросом получить из исходной строки - строку, например вида
Код: plaintext
1.
2.
'Иванофф,Петрофф,Сидорофф'
или
'Куратор,Менеджер,Менеджер'
если одним запросом нельзя, то как минимально оформить это в виде функции?
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550408
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @xml xml
set @xml =
'<Manager>
  <User Name="Иванофф" id="23">
    <Type>Куратор</Type>
  </User>
  <User Name="Петрофф" id="11">
    <Type>Менеджер</Type>
  </User>
  <User Name="Сидорофф" id="75">
    <Type>Менеджер</Type>
  </User>
</Manager>'

declare @result nvarchar(max)

select @result = isnull(@result + ',' + name, name)
  from (select r.value('@Name[1]', 'nvarchar(255)') as name
          from @xml.nodes('/Manager/User') as t(r)
        ) t
        
print @result
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550419
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По второму вопросу
Код: plaintext
1.
2.
3.
4.
select @result = isnull(@result + ',' + name, name)
  from (select r.value('text()[1]', 'nvarchar(255)') as name
          from @xml.nodes('/Manager/User/Type') as t(r)
        ) t
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550420
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
Спасибо!
если не сложно - а по тегам выборка - какой синтаксис?
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550422
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select convert (xml,N'<Manager>
   <User Name="Иванофф" id="23">
     <Type>Куратор</Type>
   </User>
   <User Name="Петрофф" id="11">
     <Type>Менеджер</Type>
   </User>
   <User Name="Сидорофф" id="75">
     <Type>Менеджер</Type>
   </User>
</Manager>').query('for $s in /Manager/User/@Name return string($s)').value('text()[1]', 'nvarchar(max)')

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550443
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
Синхронно получилось ;-) Еще раз спасибо!
Т.е. лучше все-таки делать отдельную функцию - и передавать туда строку и условия выборки? чем формировать динамический запрос? скорость роли не играет - фрагменты до 2000символов
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550444
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daw,
круто!

позволю себе немножко дополнить
Код: plaintext
'...return concat(string($s), ",")'...
а как с последней запятой быть уж не знаю
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550448
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
все! ;-) опять вместе ;-)

Всем СПАСИБО за ответы!!!!!
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550508
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
еще вопрос, пока тема не 'остыла'
не покажите синтаксис для получения результата в виде колонки, например для атрибутов
Код: plaintext
1.
2.
3.
4.
 ФИО
Иванофф
Петрофф
Сидорофф
ps
результат запроса в виде строки - уйдет для визуального отображения на формах или в секцию in динамического запроса, а в виде колонки в recordset для VBScript...хотя там можно разобрать напрямую - но так для полноты картины... если не сложно конечно
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550522
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @xml xml
set @xml =
'<Manager>
  <User Name="Иванофф" id="23">
    <Type>Куратор</Type>
  </User>
  <User Name="Петрофф" id="11">
    <Type>Менеджер</Type>
  </User>
  <User Name="Сидорофф" id="75">
    <Type>Менеджер</Type>
  </User>
</Manager>'

/*declare @result nvarchar(max)*/

/*select @result = isnull(@result + ',' + name, name)
  from (*/select r.value('@Name[1]', 'nvarchar(255)') as name
          from @xml.nodes('/Manager/User') as t(r)
        /*) t*/
        
/*print @result*/
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550529
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ef1или в секцию in динамического запросаЕсли это единственная причина, по которой запрос пришлось сделать динамическим,
то рекомендую сделать его статическим
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36550577
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
в двух словах - у нас система докоборота (LotsiaPDMPlus на базе mssql) - т.е. их макросы (их sql запросы) + наши sql запросы + наши VBScript(или JScript) с подключением к БД + их формы с вычисляемыми полями (на их статических запросах или на наших динамических, в этом случае запросах - текст запроса(и сам запрос соответственно) только один или вызов наших функций или хп БД) + отсутствие типа данных xml как такового - в общем открытая система - ищу пути оптимизации хранения/отображения/обработки данных в базовых(предложенных) типах (строка,число,дата-время)

еще раз СПАСИБО за полноценные ответы!
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36552642
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
почитал XQuery, попробовал динамически сформировать сам query через sql:variable - в смысле вставить в строковый литерал запроса переменные переданные в функцию (фрагмент поиска по тегам xml) ничего не получилось...
динамический запрос в хп формировать тоже не хочется, формировать несколько статических запросов в функции или хп тоже не вариант, сама наша система, как оказалось, строковые литералы, в данном случае, вообще корректно не передает никак.. - засада полная кругом
в связи с чем вопрос
не подскажите как - сам этот фрагмент xml вернуть простой таблицей - а ее я уже обработаю дальше...
никак не въеду как изменить предложенный вариант
Код: plaintext
1.
select r.value('@Name[1]', 'nvarchar(255)') as name
          from @xml.nodes('/Manager/User') as t(r)
для всех данных xml т.е. из строки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @xml xml
set @xml =
'<Manager>
  <User Name="Иванофф" id="23">
    <Type>Куратор</Type>
  </User>
  <User Name="Петрофф" id="11">
    <Type>Менеджер</Type>
  </User>
  <User Name="Сидорофф" id="75">
    <Type>Менеджер</Type>
  </User>
</Manager>'
получить таблицу вида
Код: plaintext
1.
2.
3.
  Name   id  Type 
Иванофф   23  Куратор
Петрофф   11  Менеджер
Сидорофф  75  Менеджер
можно без заголовков и все типа string...
не подскажите?
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36552724
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
select r.value('@Name[1]', 'nvarchar(255)') as name
      ,r.value('@id[1]', 'int') as id
      ,r.value('(Type/text())[1]', 'nvarchar(255)') as [Type]
 from @xml.nodes('/Manager/User') as t(r)
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36552730
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
СУПЕР!!!!!!
то что нужно! Спасибо
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36555105
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
наверно это не кончится ;-) проблема выявилась неожиданно - наша система не смогла принять сформированную таблицу!!!
судя по всему оказалось что если в функции встречаются обращения к XQuery - мы умираем!!!???
причем в таком виде - умираем просто (наша система падает без предупреждения)
Код: plaintext
1.
Insert	@Ret 
select r.value('@Name[1]', 'varchar(100)') from @xml.nodes('//User') as t(r)
думал может - во временную таблицу и из нее - как то так
Код: plaintext
1.
2.
Insert Into @tbl Select r.value('@Name[1]', 'varchar(100)') from @xml.nodes('//User') as t(r)
Insert	@Ret 
Select * from @tbl
падаем точно также
переделал функцию на хп
уже не падаем но получаем странное сообщение
авторSQLSTATE=42000
Microsoft OLE DB Provider for SQL Server
Ошибка SELECT, так как следующие параметры SET настроены неправильно: "ARITHABORT". Убедитесь, что указанные параметры SET можно использовать с методами индексированных представлений, с методами...
чем отличаются процедуры и функции которые возвращают одно и тоже
Код: plaintext
1.
select * from lsdbo.Ric_Get_fXmlToTable()
exec lsdbo.Ric_Get_pXmlToTable
в данном конкретном случае так и не понял

заработало когда - поместил результат в постоянную таблицу БД и читал уже оттуда - типа 'убил' объект XQuery который все 'портил' с точки зрения нашей системы наверно...
а может и еще в чем дело - не знаю пока за что зацепиться - но в любом случае постоянная таблица не подходит - нужен разбор 'на лету'

может дело в уровне совместимости...
не будет большой наглости... - если я попрошу показать код
Код: plaintext
1.
2.
3.
select r.value('@Name[1]', 'nvarchar(255)') as name
      ,r.value('@id[1]', 'int') as id
      ,r.value('(Type/text())[1]', 'nvarchar(255)') as [Type]
 from @xml.nodes('/Manager/User') as t(r)
но в синтаксисе MSSQL2000 типа FOR XML (без XQuery) - может это решит проблему?

ps
а так вроде вот оно - уже пощупать можно - а взять нельзя, да и техподдержка с разработчиками закончилась - вся надежда только на форум ...
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36555135
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ef1получаем странное сообщениеНу так установите ARITHABORT в положение ON, Вам же сервер об этом говорит
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36555196
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
упс
работает...
Спасибо - а в чем, точнее в какой момент xQuery в данном случае происходит переполнение или деление на ноль? тут вроде в запросе ничего такого нет...
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36555207
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ef1тут вроде в запросе ничего такого нет...в тексте ошибки вроде* написано что это нужно для работы с xml вообще,
ни про какие конкретные запросы речь не идет

*вы текст ошибки недоцитировали
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36555238
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
ок
сообщение показывает наша система... показывает не полностью обрезает кусок, а где посмотреть полностью не нашел, в профайлере - все чисто - вызывается хп и все...
хотя в принципе - результат есть и это главное
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #36555270
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
а нашел - вот полностью
авторОшибка SELECT, так как следующие параметры SET настроены неправильно: "ARITHABORT". Убедитесь, что указанные параметры SET можно использовать с методами индексированных представлений, с методами индексов по вычисляемым столбцам, с методами уведомлений о запросах или с методами XML-данных.
вроде и процедура достаточно 'чистая'
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
ALTER procedure [LSDBO].[Ric_Get_pXmlToTable]
as 
Begin

Declare @xml	xml
set @xml=convert(xml,
          '<Manager>
             <Filial Name="РПК-Москва" id="0">
               <User Name="Терещенко Елена Игоревна" id="72">
                 <Type>Куратор</Type>
                 <Set>Текущий</Set>
                 <Add>2010-03-30</Add>
                 <Del/>
               </User>
               <User Name="Вольнов Илья Николаевич" id="51">
                 <Type>Менеджер</Type>
                 <Set>Текущий</Set>
                 <Add>2010-03-30</Add>
                 <Del/>
               </User>
             </Filial>
           </Manager>')

--SET ARITHABORT ON
select r.value('@Name[1]', 'varchar(100)') from @xml.nodes('//User') as t(r)
--SET ARITHABORT OFF
end

ладно - вопрос снят - это уже проблемы интерпретации нашей системы
Спасибо еще раз!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
запрос к xml фрагменту
    #39617078
oleg12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Паганель
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare @xml xml
set @xml =
'<Manager>
  <User Name="Иванофф" id="23">
    <Type>Куратор</Type>
  </User>
  <User Name="Петрофф" id="11">
    <Type>Менеджер</Type>
  </User>
  <User Name="Сидорофф" id="75">
    <Type>Менеджер</Type>
  </User>
</Manager>'

/*declare @result nvarchar(max)*/

/*select @result = isnull(@result + ',' + name, name)
  from (*/select r.value('@Name[1]', 'nvarchar(255)') as name
          from @xml.nodes('/Manager/User') as t(r)
        /*) t*/
        
/*print @result*/




Уважаемые форумчане, подскажите пожалуйста, можно ли данный скрипт применить не к конкретному xml, а к целому столбцу, содержащему xml? Т.е. параметр @xml как-то задать динамически (что-то вроде @xml IN (select xml from ...)). Если возможно, то как? У меня с ходу не получилось найти. Заранее спасибо!!
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #39617079
oleg12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл добавить - Sql Server 2012 )
...
Рейтинг: 0 / 0
запрос к xml фрагменту
    #39617145
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg12345,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
declare @xml table (x_field xml)
Insert into @xml values(
'<Manager>
  <User Name="Иванофф" id="23">
    <Type>Куратор</Type>
  </User>
  <User Name="Петрофф" id="11">
    <Type>Менеджер</Type>
  </User>
  <User Name="Сидорофф" id="75">
    <Type>Менеджер</Type>
  </User>
</Manager>'),
('<Manager>
  <User Name="Иванов" id="24">
    <Type>Куратор</Type>
  </User>
  <User Name="Петров" id="12">
    <Type>Менеджер</Type>
  </User>
  <User Name="Сидоров" id="78">
    <Type>Менеджер</Type>
  </User>
</Manager>')

Select 
t.r.value('@id[1]', 'int') ,
t.r.value('@Name[1]', 'nvarchar(255)')
From @xml a
outer apply a.x_field.nodes('/Manager/User') as t(r)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / запрос к xml фрагменту
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]