powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / mssql2000-2005 прочитать значение узла xml в UDF
6 сообщений из 6, страница 1 из 1
mssql2000-2005 прочитать значение узла xml в UDF
    #39581696
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
Здравствуйте, сервер старый по версии (2000-2005), решения не смог найти...
подскажите пожалуйста как в пользовательской функции распарсить xml строку
(хочу использовать универсальную UDF на входе xml фрагмент и выражение xPath/xQuery на выходе значение узла/атрибута)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @xData XML 
DECLARE @xPath varchar(256)

set @xData= '<ServerInfo><RecCount>10</RecCount></ServerInfo>'
set @xPath='//RecCount'
set @xPath='for $s in //RecCount return string($s)'

SELECT @xData.query('for $s in //RecCount return string($s)').value('text()[1]', 'varchar(255)')
--SELECT @xData.query('@xPath').value('text()[1]', 'varchar(255)')
SELECT @xData.query('sql:variable("@xPath")').value('text()[1]', 'varchar(255)')



проблема - не могу корректно вставить локальную переменную в строковый литерал .query
если литерал прописан сразу
.query('for $s in //RecCount return string($s)'... значение выводится корректно
если литерал указывается через переменную
.query('sql:variable("@xPath")'... выводится не значение узла а значение переменной - 'for $s in //RecCount return string($s)'

?
...
Рейтинг: 0 / 0
mssql2000-2005 прочитать значение узла xml в UDF
    #39581703
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
синтаксис брал из рабочего примера
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @xData XML 
DECLARE @x INT

set @xData= '<ServerInfo><RecCount>10</RecCount></ServerInfo>'
set @x= 1134

set @xData.modify('replace value of (/ServerInfo/RecCount/text())[1] with sql:variable("@x")')
SELECT @xData



но никак на чтение не могу переписать
...
Рейтинг: 0 / 0
mssql2000-2005 прочитать значение узла xml в UDF
    #39581765
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ef1,

вам походу динамический XQuery нужен
для версии > 2005
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE @xData XML 
DECLARE @xPath varchar(256)
declare @xQuery varchar(256)
declare @sql nvarchar(max)

set @xData= '<ServerInfo><RecCount>10</RecCount></ServerInfo>'
set @xPath='//RecCount'
set @xQuery='for $s in //RecCount return string($s)'

SELECT @xData.query('for $s in //RecCount return string($s)').value('text()[1]', 'varchar(255)')
--SELECT @xData.query('@xPath').value('text()[1]', 'varchar(255)')
SELECT @xData.query('data(sql:variable("@xQuery"))')

set @sql = replace(N'select @xmldata.query(''{0}'').value(''.'', ''nvarchar(max)'');', '{0}', @xQuery);
exec sp_executesql
    @sql,
    @params = N'@xmldata xml',
    @xmldata = @xData




для версии 2005
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE @xData XML 
DECLARE @xPath varchar(256)
declare @xQuery varchar(256)
declare @sql nvarchar(max)

set @xData= '<ServerInfo><RecCount>10</RecCount></ServerInfo>'
set @xPath='//RecCount'
set @xQuery='for $s in //RecCount return string($s)'

SELECT @xData.query('for $s in //RecCount return string($s)').value('text()[1]', 'varchar(255)')
--SELECT @xData.query('@xPath').value('text()[1]', 'varchar(255)')
--SELECT @xData.query('data(sql:variable("@xQuery"))')
set @sql = replace(replace('declare @x xml; set @x =''{0}''; select @x.query(''{1}'').value(''.'', ''nvarchar(max)'')', '{0}', convert(nvarchar(max), @xData)), '{1}', @xQuery);

exec (@sql);


...
Рейтинг: 0 / 0
mssql2000-2005 прочитать значение узла xml в UDF
    #39581785
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
да, похоже на то....
думал о динамическом запросе...

felix_ff - большое спасибо!!! - все ок, тему закрываем
...
Рейтинг: 0 / 0
mssql2000-2005 прочитать значение узла xml в UDF
    #39595320
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
felix_ff - еще один вопрос (для варианта MSSQL2005)

столкнулся с ограничением динамического запроса 'парсера xml' в 4к, хотя указан nvarchar(max) 8к/2g - но где-то режется до 4к - не подскажите где это ограничение в тексте хп

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ALTER procedure [LSDBO].[Ric_Get_XmlParser_ForForms]
        (@xData xml,      		 -- исходная xml строка
         @xQuery varchar(256)       -- строка с xPath/xQuery запросом 
         )as 
Begin

declare @sql nvarchar(max)

 Set ARITHABORT ON --без этого наш клиент падает

  Begin
    set @xQuery = 'for $s in ' + @xQuery +' return string($s)' 
    set @sql = replace(replace(N'declare @x xml; set @x =''{0}''; select @x.query(''{1}'').value(''.'', ''nvarchar(max)'')', '{0}', convert(nvarchar(max), @xData)), '{1}', @xQuery);
    exec (@sql);    
  End

  Set ARITHABORT OFF
End


Код: sql
1.
exec LSDBO.Ric_Get_XmlParser_ForForms xmlfragment, xPath/xQuery



все режет - @xQuery своим типом varchar(256)?
...
Рейтинг: 0 / 0
mssql2000-2005 прочитать значение узла xml в UDF
    #39595338
ef1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ef1
Гость
сам спросил сам ответил, обрезание было в двойном replace в одной строке, если разложить по отдельности - до 4к не срезается
Код: sql
1.
2.
--режется до 4к
set @sql = replace(replace('declare @x xml; set @x =''{0}''; select @x.query(''{1}'').value(''.'', ''nvarchar(max)'')', '{0}', convert(nvarchar(max), @xData)), '{1}', @xQuery);


Код: sql
1.
2.
3.
4.
--не режется     
    set @sql='declare @x xml; set @x =''{0}''; select @x.query(''{1}'').value(''.'', ''nvarchar(max)'')'
    set @sql=replace(@sql,'{1}', @xQuery);
    set @sql=replace(@sql,'{0}', convert(nvarchar(max), @xData));
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / mssql2000-2005 прочитать значение узла xml в UDF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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