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:variable和sql:column,但是这是TSQL函数的结果.)
不知道你想在这做什么.你提到了一个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&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&381</v>
</e>
</root>
Run Code Online (Sandbox Code Playgroud)