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

Откуда:
Сообщений: 54
Здравствуйте, помогите пожалуйста с SQL запросом
есть таблица где хранится id и xml
id - уникальное значение
мне надо из xml получить данные
и подставить их в <Name2>сюда данные</Name2>
с перезаписью всего существующего в блоке <Name2>всё что тут есть - перезаписать</Name2>
может есть пример цикла, как это можно сделать?
и еще проблема, что надо как-то округлять данные из xml до целого, т.е. там хранится <fat3>11.000000000</fat3> а мне надо значение <fat3>11</fat3>
--
Я понимаю что всё муторно описал, но мне бы пример какой-нить чтобы его адаптировать
24 окт 19, 18:10    [22001975]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
lex871
Member

Откуда:
Сообщений: 54
то что получил парсингомid
Калорийность: Ж:10.000000000гр. , Б:10.000000000гр. , У:10.000000000гр. , Калорийность:170.000000000 ккал409FB9AD-CC87-498A-AAFA-07D848D288E2
Калорийность: Ж:11.000000000гр. , Б:12.000000000гр. , У:13.000000000гр. , Калорийность:199.000000000 ккал78C7310B-1253-4A44-9DEC-30428108D3E7
Калорийность: Ж:10.000000000гр. , Б:10.000000000гр. , У:10.000000000гр. , Калорийность:170.000000000 ккал0DDB68B5-500F-970C-0151-3EDD574B21CB
Калорийность: Ж:10.000000000гр. , Б:20.000000000гр. , У:30.000000000гр. , Калорийность:290.000000000 ккал29D2FF4D-DB92-499E-83F4-9FEB3723B91B


это бы округлить до

то что получилосьid
Калорийность: Ж:10гр. , Б:10гр. , У:10гр. , Калорийность:170 ккал409FB9AD-CC87-498A-AAFA-07D848D288E2
Калорийность: Ж:11гр. , Б:12гр. , У:13гр. , Калорийность:199 ккал78C7310B-1253-4A44-9DEC-30428108D3E7
Калорийность: Ж:10гр. , Б:10гр. , У:10гр. , Калорийность:170 ккал0DDB68B5-500F-970C-0151-3EDD574B21CB
Калорийность: Ж:10гр. , Б:20гр. , У:30гр. , Калорийность:290 ккал29D2FF4D-DB92-499E-83F4-9FEB3723B91B

и подставить перезаписью каждому id
24 окт 19, 18:13    [22001979]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
lex871, replace value of.

И это не XML.
24 окт 19, 18:14    [22001981]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
lex871
Member

Откуда:
Сообщений: 54
Minamoto, спасибо за ответ. А как можно округлять я столбец получаю запросом
select 'Калорийность:'+' Ж:'+CAST(cast(xml as xml).query('/r/fatAmount/node()') as nvarchar(max)) + 'гр. , Б:' + CAST(cast(xml as xml).query('/r/fiberAmount/node()') as nvarchar(max))+'гр. , У:'+ CAST(cast(xml as xml).query('/r/carbohydrateAmount/node()') as nvarchar(max))+'гр. , Калорийность:'+ CAST(cast(xml as xml).query('/r/energyAmount/node()') as nvarchar(max))+' ккал', * from .[dbo].[entity]
24 окт 19, 18:25    [22001999]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
lex871,


SELECT CAST(CAST(CAST(XML AS XML).value('(/r/fatAmount/text())[1]', 'numeric(36, 10)') AS int) AS nvarchar(MAX))
	,*
FROM [dbo].[entity]
24 окт 19, 18:37    [22002013]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
lex871
Member

Откуда:
Сообщений: 54
set @dest_xml.modify('replace value of (.//description/text())[1] with sql:variable("@bar1")')
перезаписывает только в том случае, если блок содержит значение, а если он пустой, то как правильно тут поменять?
<description /> - вот такой не перезаписывает
25 окт 19, 14:22    [22002646]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
lex871
set @dest_xml.modify('replace value of (.//description/text())[1] with sql:variable("@bar1")')
перезаписывает только в том случае, если блок содержит значение, а если он пустой, то как правильно тут поменять?
<description /> - вот такой не перезаписывает
Не нашел более лучшего выхода, чем сначала записать полный тэг, потом удалить лишний:

SET @dest_xml.modify('insert <description>{sql:variable("@bar1")}</description> as last into (.//description/..)[1]')
SET @dest_xml.modify('delete (.//description)[1]')
25 окт 19, 14:47    [22002687]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
lex871
Member

Откуда:
Сообщений: 54
Minamoto, спасибо большое. Всё вроде получилось!
25 окт 19, 15:12    [22002715]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
DbDude
Member

Откуда:
Сообщений: 22
Minamoto, привет.
Есть еще вот такой вариант:

DECLARE @bar1 VARCHAR(max) = 'new text'
DECLARE @xml XML = '<description>previous text</description>
                    <description/>'

SELECT @xml.query('for $d in description
return <description>{sql:variable("@bar1")}</description>')
28 окт 19, 10:11    [22003922]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
DbDude
Member

Откуда:
Сообщений: 22
lex871, округлить до целого можно так:
DECLARE @xml XML = '<fat3>11.66</fat3><fat3>11.22</fat3>'
SELECT @xml.query('for $f in fat3
return <fat3>{fn:round(data($f/text())[1])}</fat3>')
28 окт 19, 10:33    [22003965]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
DbDude
Minamoto, привет.
Есть еще вот такой вариант:

DECLARE @bar1 VARCHAR(max) = 'new text'
DECLARE @xml XML = '<description>previous text</description>
                    <description/>'

SELECT @xml.query('for $d in description
return <description>{sql:variable("@bar1")}</description>')
Ну так себе решение... Для некоторых вариантов XML подойдет, но далеко не для всех.

DECLARE @bar1 VARCHAR(max) = 'new text'
DECLARE @xml XML = '<test>
    <some_data>some_value</some_data>
    <description>previous text</description>
    <description/>
</test>'

SELECT @xml.query('for $d in description
return <description>{sql:variable("@bar1")}</description>')


Для общего развития, конечно, спасибо, такого использования не видел.
28 окт 19, 11:38    [22004039]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
DbDude
Member

Откуда:
Сообщений: 22
Minamoto,
если нужно заменить текст для узлов с разными именами, то можно сделать так:
DECLARE @bar1 VARCHAR(max) = 'new text'
DECLARE @xml XML = '<test>
    <some_data>some_value</some_data>
    <description>previous text</description>
    <description/>
</test>'

SELECT @xml.query('for $d in test/*        
    return if (local-name($d) = "some_data")
        then <some_data>{sql:variable("@bar1")}</some_data> else 
        if (local-name($d) = "description")
        then <description>{sql:variable("@bar1")}</description> else $d')
28 окт 19, 12:20    [22004095]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml и подстановка значений в xml в блок  [new]
DbDude
Member

Откуда:
Сообщений: 22
Minamoto, или лучше вот так, чтобы корневой узел не пропадал:

DECLARE @bar1 VARCHAR(max) = 'new text'
DECLARE @xml XML = '<test>
    <some_data>some_value</some_data>
    <description>previous text</description>
    <description/>    
</test>'

SELECT @xml.query('
for $t in test
return <test> 
{for $d in $t/*        
    return if (local-name($d) = "some_data")
        then <some_data>{sql:variable("@bar1")}</some_data> else 
        if (local-name($d) = "description")
        then <description>{sql:variable("@bar1")}</description> else $d}
</test>')
28 окт 19, 12:33    [22004100]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить