ОК, во-первых, это не может работать:
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
.Конечно, вы также можете заменить целые узлы, но здесь это кажется ненужным.