2016-01-08 6 views
0

У меня есть поле типа данных , называемое XMLText, в SQL Server 2012. Я хотел бы удалить все поля 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

Один метод использовать рекурсивный CTE с PATINDEX() и STUFF(), чтобы удалить все вхождения. – Rabbit

+0

В вашем столбце SQL содержится одно появление 'sageid' или несколько строк в строке? ** [Демо] (https://data.stackexchange.com/stackoverflow/query/421226) ** – lad2025

+0

@Rabbit Вы можете использовать STUFF для удаления фрагментов строки? –

ответ

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 не является хорошо сформированным (не корневой элемент) ,

EDIT:

Если XML Text имеет другую структуру, и вы хотите, чтобы найти все 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

Вы бы считали, что разделить эту большую линию на разные части? –

Смежные вопросы