如何更新SQL Server中ntext列中的XML字符串?

时间:2009-08-03 10:20:54

标签: sql sql-server tsql

有一个包含2列的SQL表。 ID(int)和Value(ntext)

值行中包含各种xml字符串。

ID   Value
--   ------------------

1    <ROOT><Type current="TypeA"/></ROOT>
2    <XML><Name current="MyName"/><XML>
3    <TYPE><Colour current="Yellow"/><TYPE>
4    <TYPE><Colour current="Yellow" Size="Large"/><TYPE>
5    <TYPE><Colour current="Blue" Size="Large"/><TYPE>
6    <XML><Name current="Yellow"/><XML>

我如何:

一个。列出

所在的行
`<TYPE><Colour current="Yellow",`
    bearing in mind that there is an entry
    <XML><Name current="Yellow"/><XML>

B中。修改包含

的行
<TYPE><Colour current="Yellow" to be
<TYPE><Colour current="Purple"

谢谢! 4你的帮助

2 个答案:

答案 0 :(得分:4)

SQL Server 2005+中,使用中间临时表:

DECLARE @q AS TABLE (xid INT NOT NULL, xdoc XML NOT NULL, modified TINYINT NOT NULL DEFAULT 0)

INSERT
INTO    @q (xid, xdoc)
SELECT  id, doc
FROM    mytable

UPDATE  @q
SET     xdoc.modify('replace value of (/TYPE/@Colour)[1] with "blue"'),
        modified = 1
WHERE   xdoc.value('(/TYPE/@Colour)[1]', 'NVARCHAR(MAX)') = 'Yellow'

UPDATE  mytable
SET     doc = CAST(xdoc AS NVARCHAR(MAX))
FROM    @q q
WHERE   id = q.xid
        AND q.modified = 1

答案 1 :(得分:1)

由于它是一个NTEXT字段,不幸的是你不能使用任何常用的字符串函数。

您使用的是什么版本的SQL Server?

如果您使用的是SQL Server 2005及更高版本,则有两种选择:

  • 您可以将NTEXT转换为NVARCHAR(MAX),然后您可以使用所有常用的字符串函数,例如REPLACESUBSTRING等等
  • 您可以将NTEXT转换为XML并使用可用于SQL Server 2005的XML函数

第一个选项可能如下所示:

UPDATE 
  YourTable
SET
  Value = CAST(REPLACE(CAST(Value as NVARCHAR(MAX)), 
                       'Colour="Yellow"', 'Colour="Blue"') AS NTEXT) 
WHERE
  .......

对于第二个选项,请参阅Quasnoi的答案 - 但请注意:您的XML有点奇怪......

<TYPE><Colour="Yellow" Size="Large"></TYPE>

有点不寻常,我认为无效 - “颜色”是<TYPE>标签上的属性

<TYPE Colour="Yellow" Size="Large"></TYPE>

或者<Colour>本身就是一个XML标签,但必须将“黄色”分配给一个 属性:

<TYPE><Colour current="Yellow" Size="Large"></TYPE>

您不能像在XML,IMHO中那样直接为XML标记赋值。

如果您使用的是SQL Server 2000,事情会变得更加困难......

马克