从SQL列中删除字符串

时间:2016-01-08 18:19:40

标签: sql sql-server xml tsql sql-server-2012

我在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字符串操作是什么?

2 个答案:

答案 0 :(得分:4)

TEXT is deprecated。将您的XML块存储为XMLNVARCHAR(MAX)

您可以使用xml.modifydelete一次删除多次出现:

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), '')