Какой скрипт для замены значений в XML является более корректным
Есть в таблице XML вида
'<MyData>
<Text name="MyFirstName" secondname="MySecondName" />
</MyData>'
Нужно заменить имя MyFirstName на MyNewFirstName. Есть два способа
1)
update @MyTable
set MyXML = REPLACE(convert(nvarchar(MAX), MyXML),'<Text name="MyFirstName"','<Text name="MyNewFirstName"' )
update @MyTable
set MyXML.modify('replace value of (/MyData/Text[@name = "MyFirstName"]/@name)[1] with ("MyNewFirstName")' )
2й выглядит более XQuery, но требует и больше ресурсов(выполняется дольше). Какой бы выбрали вы?
Ответы (1 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
Поскольку тип данных столбца - XML, его собственный метод XQuery безопаснее и лучше. XML чувствителен к регистру. Кроме того, значение атрибутов XML может быть заключено в одинарные кавычки. Таким образом, функция REPLACE () не сработает.
Пожалуйста, проголосуйте за: SQL Server vNext (post 2019) and NoSQL functionality
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<MyData>
<Text name="MyFirstName" secondname="MySecondName"/>
</MyData>');
-- DDL and sample data population, end
DECLARE @var VARCHAR(30) = 'MyNewFirstName';
UPDATE @tbl
SET xmldata.modify('replace value of (/MyData/Text[@name = "MyFirstName"]/@name)[1]
with (sql:variable("@var"))' );
-- test
SELECT * FROM @tbl;