2011-09-22 17 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

相關問題