2011-09-22 66 views
2

我有一个MS SQL 2008 R2标准数据库。我有一列varchar(250)数据和一列xml如何使用T-SQL内置函数的值更新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:variablesql:column,但这是TSQL函数的结果。)

+0

你能告诉的东西类似于你想要做什么?现在它非常抽象。你也可以指定SQL Server的版本,以及列是否真的是不赞成使用的类型'TEXT'或者你的意思是一个字符串列如'VARCHAR' /'NVARCHAR' ... –

+0

我编辑了我的问题。现在应该更清楚了。 – Michas

回答

7

不知道你想在这里做什么。你提到一个TSQL函数,如果这是替换&到&它没有必要。它由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&amp;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&amp;381</v> 
    </e> 
</root> 
+0

但是,如果需要,替换是可以做到:**更新 SET rest.modify( '插入 链接{ SQL:列( “idstr_new”)}到(/根)[1]' ) FROM (SELECT B.rest,REPLACE(B.idstr,'&','&')idstr_new FROM @Art B WHERE idstr LIKE'%&%' - AND parent = 160 )A'* * – Dalex

+0

好吧。它看起来很有效。毕竟,我的问题微不足道。不过,我想要一个可以处理更复杂的TSQL表达式的解决方案。 – Michas

+0

@Michas - 用更复杂的表达式更新了答案。 –

1

假设你的表中有一个关键:

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,'&','&amp;') 
    + '</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; 
+0

它看起来很有效。但是,我想避免从字符串执行TSQL。 – Michas

相关问题