2016-01-08 95 views
0

我在SQL Server 2012中有一個名爲「XMLText」的TEXT數據類型字段。我想要做的是刪除任何SageID字段。因此,這一長串的字段包含的東西,看起來像這樣:從SQL列刪除字符串

<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

一種方法是使用PATINDEX()和STUFF()的遞歸CTE刪除所有發生。 – Rabbit

+0

您的SQL列是否包含一個「sageid」或每行多個? ** [演示](https://data.stackexchange.com/stackoverflow/query/421226)** – lad2025

+0

@Rabbit您可以使用STUFF刪除字符串片段? –

回答

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

這是很好的解決方案 – techspider

+2

@techspider這將工作,但OP應該修復他的模式。 – lad2025

+1

是真的......這是基本的期望......不過你做得很好! – techspider

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

你會考慮在不同的部分拆分那條大線嗎? –