Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
lex871 Member Откуда: Сообщений: 54 |
это бы округлить до
и подставить перезаписью каждому id |
||||||||||||||||||||||
24 окт 19, 18:13 [22001979] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
lex871, replace value of. И это не XML. |
24 окт 19, 18:14 [22001981] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
lex871 Member Откуда: Сообщений: 54 |
set @dest_xml.modify('replace value of (.//description/text())[1] with sql:variable("@bar1")') перезаписывает только в том случае, если блок содержит значение, а если он пустой, то как правильно тут поменять? <description /> - вот такой не перезаписывает |
25 окт 19, 14:22 [22002646] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
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] Ответить | Цитировать Сообщить модератору |
lex871 Member Откуда: Сообщений: 54 |
Minamoto, спасибо большое. Всё вроде получилось! |
25 окт 19, 15:12 [22002715] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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 | ![]() |