Какой скрипт для замены значений в 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;
→ Ссылка