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

如何在SQL Server中更新ntext列中的XML字符串?,sql,sql-server,tsql,Sql,Sql Server,Tsql,有一个包含两列的SQL表。ID(int)和值(ntext) 值行中包含各种xml字符串 ID Value -- ------------------ 1 <ROOT><Type current="TypeA"/></ROOT> 2 <XML><Name current="MyName"/><XML> 3 <TYPE><Colour current="Yellow"/><

有一个包含两列的SQL表。ID(int)和值(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>
ID值
--   ------------------
1.
2.
3.
4.
5.
6.
我如何:

A.列出其中的行

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

`由于它是一个NTEXT字段,很遗憾,您不能使用任何常用的字符串函数

您正在使用哪个版本的SQL Server

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

  • 您可以将NTEXT强制转换为NVARCHAR(MAX),然后可以使用所有常用的字符串函数,如
    REPLACE
    SUBSTRING
  • 您可以将NTEXT转换为XML,并使用sqlserver2005可用的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 Colour="Yellow" Size="Large"></TYPE>

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

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

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

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


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

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

我想告诉您“更新中缺少“黄色”上的过滤器”,但整个XML内容在更新中都搞砸了OP@devio:无论如何,这个过滤器不会损坏。谢谢。@Quassnoi:既然他被一个NTEXT列困住了,他该怎么办?@John:我想应该使用一个中间临时表。
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