XML DML заменить результатом функции

Я хотел бы динамически заменить значение элемента XML в выбранных значениях XML, извлекаемых из таблицы. Эта замена должна быть выполнена функцией, которую я хотел бы вызвать. Я даже не могу найти никаких подсказок, чтобы указать мне правильное направление...

У меня есть следующий фрагмент кода (неполный), который, я считаю, является правильной структурой для использования XPath, чтобы добраться до нужного мне элемента и определить с помощью XPath, какие записи меня интересуют (одну или несколько), откуда я понятия не имею как взять результат вызванной функции и в идеале поместить результат в столбец sql::

UPDATE [database].[dbo].[table_with_xml]
    SET table_with_xml.modify('replace value of (//PrimaryApplicant/FName/text())[1] with sql:column("")')
    FROM [database].[dbo].[table_with_xml] AS [XML_Table]
    WHERE [XML_Table].XML_Field.value('(//HeaderData/CountryCode/text())[1]', 'varchar(100)') = '123'

1 ответ

Прежде всего, если вы хотите обновить данные таблицы из функции, вам не разрешено это делать. Вы можете использовать сохраненный процесс, хотя. Вы можете динамически отправить в него оператор "заменить значение" (из приведенного выше синтаксиса) и отправить значение, которым вы хотите заменить. Вот код, демонстрирующий то, что я пытаюсь сказать:

Create PROC changeXML
@xmlPath nvarchar(max), -- the statement 'replace value of'
@value nvarchar(max) -- the new value
AS
BEGIN
DECLARE @pathString nvarchar(max), @sql NVARCHAR(MAX);
-- create full statement dynamically
SET @pathString =  'replace value of ('+@xmlPath+'text())[1] with  ("'+@value+'")';
SELECT @pathString;
-- create dynamic sql and pass pathstring to it.
SET @sql = 'UPDATE [dbo].[tableWithXmlData] SET a.modify(''@p'')';
-- execute dynamic sql
EXEC sp_executesql @sql, N'@p nvarchar(max)', @p = @pathString
END

Затем запустите proc примерно так:

EXEC [dbo].[chnageXML] @xmlPath = N'path to your xml value', 
@value = N'new value'
Другие вопросы по тегам