Обновление узлов данных xml путем передачи переменной SQL - PullRequest
0 голосов
/ 25 марта 2019

У меня есть следующий XML, и мне нужно обновить указанный на основе параметра:

<DOPremium>
    <BasePremium>337500</BasePremium>
    <TotalPremium>337500</TotalPremium>
    <NettPremium>337500</NettPremium>
    <GrossPremium>337500</GrossPremium>
    <OptionId>0</OptionId>
</DOPremium>
<DOPremium>
     <BasePremium>337500</BasePremium>
     <TotalPremium>337500</TotalPremium>
     <NettPremium>337500</NettPremium>
     <GrossPremium>337500</GrossPremium>
     <OptionId>1</OptionId>
</DOPremium>
<DOPremium>
     <BasePremium>337500</BasePremium>
     <TotalPremium>337500</TotalPremium>
     <NettPremium>337500</NettPremium>
     <GrossPremium>337500</GrossPremium>
     <OptionId>2</OptionId>
</DOPremium>

Я пытаюсь обновить соответствующие узлы на основе выбора объекта DOPremium,но я не могу этого сделать.Может кто-нибудь проверить, где я не прав?

SET @NewXmlValue = N' <BasePremium>[sql:variable("@R15_premium")]</BasePremium>'
SET @DataXml.modify('delete /*/Premiums/DOPremium/BasePremium[sql:variable("@OptionID")]')          
SET @DataXml.modify('insert sql:variable("@NewXmlValue") into (/*/Premiums/DOPremium[sql:variable("@OptionID")])[1]')           

-- Add TotalPremium
SET @NewXmlValue = N' <TotalPremium>[sql:variable("@R15_premium")]</TotalPremium>'
SET @DataXml.modify('delete /*/Premiums/DOPremium/TotalPremium[sql:variable("@OptionID")]')         
SET @DataXml.modify('insert sql:variable("@NewXmlValue") into (/*/Premiums/DOPremium[sql:variable("@OptionID")])[1]')

1 Ответ

0 голосов
/ 25 марта 2019

ОК, во-первых, это не может работать:

SET @NewXmlValue = N'<BasePremium>[sql:variable("@R15_premium")]</BasePremium>'

sql:variable() интерпретируется только как функция в операции XQuery.Это не операция XQuery, поэтому она будет просто вставлять текст sql:variable(...).Если вам нужен фактический узел XML с текстовым значением переменной, вам нужно быть немного более округлым:

SET @NewXmlValue = '';
SET @NewXmlValue = (SELECT @NewXmlValue.query('<BasePremium>{sql:variable("@R15_premium")}</BasePremium>'));

Этот подход (и другие) можно найти в документах .(В этом очень простом случае конкатенация строк в T-SQL, конечно, также работает, но в целом это не очень хорошая идея, поскольку она не заботится о экранировании XML при необходимости.)

Синтаксисдля выбора нужного узла DOPremium также требуется работа - /BasePremium[sql:variable("@OptionID")] допустим, но это означает «узел BasePremium, который, последовательно нумеруя от 1, имеет номер @OptionID».Если предполагается, что @OptionID соответствует тому, что находится в OptionID, это не способ написать это.

Если вы намеревались написать ", измените содержимое BasePremium значения узла на OptionID текст, равный @OptionID значению @R15_premium ", вот как вы это делаете (ну, один из способов сделать это):

SET @DataXml.modify('
    replace value of (
        /*
        /Premiums
        /DOPremium[child::OptionId/.=sql:variable("@OptionID")]
        /BasePremium
        /text()
    )[1] 
    with sql:variable("@R15_premium")')

и нечто подобное для TotalPremium.Конечно, вы также можете заменить целые узлы, но здесь это кажется ненужным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...