如何使用T-SQL内置函数中的值更新XML列?

Mic*_*has 2 xml t-sql sql-server xml-dml sql-server-2008-r2

我有一个MS SQL 2008 R2标准数据库.我有一个包含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)
)
Run Code Online (Sandbox Code Playgroud)

问题是我想在大约140条记录中将字符串函数的结果插入到xml中.我试过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
Run Code Online (Sandbox Code Playgroud)

但是,我有这个错误:

The argument 1 of the XML data type method "modify" must be a string literal.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我想避免使用时态字段,外部语言和从生成的字符串执行TSQL?(我听说过的sql:variablesql:column,但是这是TSQL函数的结果.)

Mik*_*son 7

不知道你想在这做什么.你提到了一个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 
Run Code Online (Sandbox Code Playgroud)

结果:

<root>
  <e>
    <k>link</k>
    <v>123&amp;456</v>
  </e>
</root>
Run Code Online (Sandbox Code Playgroud)

更新

对于不那么微不足道的情况,您可以使用交叉应用将所需的值添加到列中.

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 
Run Code Online (Sandbox Code Playgroud)

结果:

<root>
  <e>
    <k>link</k>
    <v>laivirToStoN654&amp;381</v>
  </e>
</root>
Run Code Online (Sandbox Code Playgroud)