我在TEXT
中有一个名为“XMLText”的SQL Server 2012
数据类型字段。我想要做的是删除所有SageID
字段。所以这个长字符串字段包含如下所示的内容:
<pair n="priorinstitution2" v="Yale School of Medicine" />
<pair n="priorinstitution3" v="" />
<pair n="sageid" v="20668528" />
<pair n="priorinstitution1" v="University of Chicago" />
我想要删除SageID
标记的所有内容,以便最终结果如下:
<pair n="priorinstitution2" v="Yale School of Medicine" />
<pair n="priorinstitution3" v="" />
<pair n="priorinstitution1" v="University of Chicago" />
显然,它不在现场的固定位置,而v =可以是任何数字或长度。执行此操作的SQL字符串操作是什么?
答案 0 :(得分:4)
TEXT
is deprecated。将您的XML
块存储为XML
或NVARCHAR(MAX)
。
您可以使用xml.modify
和delete
一次删除多次出现:
CREATE TABLE #tab(id INT, col TEXT);
INSERT INTO #tab(id, col)
VALUES
(1, '<pair n="priorinstitution2" v="Yale School of Medicine" />
<pair n="priorinstitution3" v="" />
<pair n="sageid" v="20668528" />
<pair n="priorinstitution1" v="University of Chicago" />')
,(2, '<pair n="sageid" v="2" y="adsadasdasd"/>
<pair n="priorinstitution2" v="Yale School of Medicine" />
<pair n="priorinstitution3" v="" />
<pair n="sageid" v="20668528" />
<pair n="priorinstitution1" v="University of Chicago" />
<pair n="sageid" v="2066852832421432" z="aaaa" />');
SELECT *, xml_col = CAST(col AS XML)
INTO #temp
FROM #tab;
UPDATE #temp
SET xml_col.modify('delete /pair[@n="sageid"]');
UPDATE t1
SET col = CAST(t2.xml_col AS NVARCHAR(MAX))
FROM #tab t1
JOIN #temp t2
ON t1.id = t2.id;
SELECT *
FROM #tab;
的 LiveDemo
强>
请记住,您的XML数据格式不正确(没有根元素)。
修改强>
如果您的XML文本具有不同的结构,并且您想查找具有属性pair
的所有n="sageid"
元素,请使用:
UPDATE #temp
SET xml_col.modify('delete //pair[@n="sageid"]');
的 LiveDemo2
强>
答案 1 :(得分:1)
不是一个很好的解决方案,但要找到标记开头和结尾的位置,并用空白字符串替换它
UPDATE YourTable
SET yourColumn = REPLACE(yourColumn, SUBSTRING(yourColumn, CHARINDEX('<pair n="sageid"', yourColumn), CHARINDEX('/>', yourColumn, CHARINDEX('<pair n="sageid"', yourColumn)) - CHARINDEX('<pair n="sageid"', yourColumn) + 2), '')
添加以下脚本进行调试
DECLARE @str AS VARCHAR(255) = '<pair n="priorinstitution2" v="Yale School of Medicine" /><pair n="priorinstitution3" v="" /><pair n="sageid" v="20668528" /><pair n="priorinstitution1" v="University of Chicago" />'
SELECT REPLACE(@str, SUBSTRING(@str, CHARINDEX('<pair n="sageid"', @str), CHARINDEX('/>', @str, CHARINDEX('<pair n="sageid"', @str)) - CHARINDEX('<pair n="sageid"', @str) + 2), '')