Как обновить столбец XML значением из встроенной функции T-SQL?
У меня есть база данных MS SQL 2008 R2 Standard. У меня есть колонка с varchar(250)
данные и столбец с xml
,
CREATE TABLE [dbo].[art](
[id] [int] IDENTITY(1,1) NOT NULL,
[idstr] [varchar](250) NULL,
[rest] [xml] NOT NULL,
CONSTRAINT [PK_art] PRIMARY KEY CLUSTERED ([id] ASC)
)
Проблема в том, что я хочу вставить результат строковой функции в xml, примерно в 140 записей. Я пытался использовать xml.modify
с динамически генерируемым текстом.
UPDATE [pwi_new].[dbo].[art]
SET rest.modify('insert <e><k>link</k><v>'
+ my_string_function(idstr) + '</v></e> into (/root)[1]')
WHERE parent = 160
AND idstr LIKE '%&%'
GO
Тем не менее, у меня есть эта ошибка:
The argument 1 of the XML data type method "modify" must be a string literal.
Есть идеи? Я хотел бы избежать использования временных полей, внешних языков и выполнения TSQL из сгенерированной строки? (Я слышал о sql:variable
а также sql:column
, но это результат функции tsql.)
2 ответа
Не уверен, что вы хотите сделать здесь. Вы упоминаете функцию TSQL, и если это замена & to &, это не обязательно. Об этом позаботится SQL Server для вас.
Тест с использованием табличной переменной @art
:
declare @art table(parent int, idstr varchar(250), rest xml)
insert into @art values
(160, '123&456', '<root></root>')
update @art
set rest.modify('insert (<e><k>link</k><v>{sql:column("idstr")}</v></e>) into (/root)[1]')
where parent = 160 and
idstr like '%&%'
select rest
from @art
Результат:
<root>
<e>
<k>link</k>
<v>123&456</v>
</e>
</root>
Обновить
В не очень тривиальных ситуациях вы можете использовать перекрестное применение, чтобы получить нужные значения в столбце.
declare @art table(parent int, idstr varchar(250), rest xml)
insert into @art values
(160, '123&456', '<root></root>')
update a
set rest.modify('insert (<e><k>link</k><v>{sql:column("T.X")}</v></e>) into (/root)[1]')
from @art as a
cross apply (select reverse(replace(idstr, '2', '8')+'NotSoTrivial')) as T(X)
where parent = 160 and
idstr like '%&%'
select rest
from @art
Результат:
<root>
<e>
<k>link</k>
<v>laivirToStoN654&381</v>
</e>
</root>
Предполагая, что у вашей таблицы есть ключ:
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += CHAR(13) + CHAR(10) + 'UPDATE [pwi_new].[dbo].[art] '
+ ' SET rest.modify(''insert <e><k>link</k><v>'
+ REPLACE(idstr,'&','&')
+ '</v></e> into (/root)[1]'') WHERE key_column = '
+ CONVERT(VARCHAR(12), key_column) + ';'
FROM [pwi_new].[dbo].[art]
WHERE parent = 160
AND idstr LIKE '%&%';
PRINT @sql;
--EXEC sp_executesql @sql;