如何在SQL Server中更新ntext列中的XML字符串?
有一个包含两列的SQL表。ID(int)和值(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"/><
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