2016-08-23 6 views
1

Я работаю с SQL Server 2008, и я пытаюсь заменить строку в столбце. Проблема в том, что ответ слишком медленный, потому что у меня большое количество записей: 300 000 строк , и я делаю несколько вложенных заметок. Вот мой запрос:SQL Server 2008 заменить несколько строк Slow

Select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace 
     (replace(replace(replace(replace(replace(replace(replace(convert(varchar(max),xmlData),'Administration1','Administration') 
     ,'Administration2','Administration'),'Administration3','Administration'),'Administration4','Administration') 
     ,'Administration5','Administration'),'Administration6','Administration'),'Administration7','Administration') 
     ,'Administration8','Administration'),'Administration9','Administration'),'Administration10','Administration') 
     ,'Administration11','Administration'),'Administration12','Administration'),'Administration13','Administration') 
     ,'Administration14','Administration'),'Administration15','Administration'),'Administration16','Administration') 
     ,'Administration17','Administration'),'Administration18','Administration'),'Administration19','Administration') 
     ,'Administration20','Administration') from tbPatient_CarnetVacxml 

меня попробовать Рекурсивный КТР, но я не знаю, если это правильный способ сделать это:

;With cte(xmlData) 
     as 
     (
     --Select replace(convert(varchar(max),xmlData),'Administration1','Administration') FROM tbPatient_CarnetVacxml 
     Select dbo.ReplaceAdministration(convert(varchar(max),xmlData)) FROM tbPatient_CarnetVacxml 
     ) 
     select * from cte 

с функцией:

CREATE FUNCTION ReplaceAdministration (@xmlData AS varchar(max)) 
RETURNS varchar(max) 
BEGIN 

declare @BASE as varchar(max), 
     @II as Int 

set @BASE = 'Administration' 
set @II = 1 

while (@II < 21) 
BEGIN 
    select @xmlData = REPLACE(@xmlData, @BASE + CONVERT(varchar(10), @II), @BASE) 
    set @II = @II + 1 
END 

return @xmlData 
END 

Любой помощь была бы оценена :)

EDIT

Ожидаемый выход

<IDObjet><Administration><Unite>1</Unite><Date/><Texte>2010</Texte><Initiale/><Site/><Cancel/><IdNote/><IDRV/></Administration></IDObjet> 
<IDObjet><Administration><Unite>1</Unite><Date/><Texte>ft selon client</Texte><Initiale/><Site/><Cancel/><IdNote/><IDRV/></Administration></IDObjet> 
<IDObjet><Administration><Unite>1</Unite><Date/><Texte>ft selon client</Texte><Initiale/><Site/><Cancel/><IdNote/><IDRV/></Administration><Administration><Unite>1</Unite><Date/><Texte>2008-01-17</Texte><Initiale>CVRS</Initiale><Site/><Cancel/><IdNote/><IDRV/></Administration><Administration><Unite>1</Unite><Date/><Texte>2008-09-02</Texte><Initiale>CVRS</Initiale><Site/><Cancel/><IdNote/><IDRV/></Administration></IDObjet> 
<IDObjet><Administration><Unite>1</Unite><Date/><Texte>ft selon client</Texte><Initiale/><Site/><Cancel/><IdNote/><IDRV/></Administration><Administration><Unite>1</Unite><Date/><Texte>ft selon client</Texte><Initiale/><Site/><Cancel/><IdNote/><IDRV/></Administration><Administration><Unite>1</Unite><Date/><Texte>ft selon client</Texte><Initiale/><Site/><Cancel/><IdNote/><IDRV/></Administration></IDObjet> 
<IDObjet><Administration><Unite>1</Unite><Date/><Texte>2008-11-19</Texte><Initiale/><Site/><Cancel/><IdNote/><IDRV/></Administration></IDObjet> 


<Administration1> to <Administration> 
<Administration2> to <Administration> 
<Administration3> to <Administration> 
......... 
<Administration20> to <Administration> 
+0

Пожалуйста, покажите ожидаемый вывод и строку примера того, что вы пытаетесь заменить – TheGameiswar

+0

Не используйте функцию. Функции - это убийцы производительности в sql-сервере. Вы заявили, что у вас 300 000 строк. Ваша функция вызывается для каждой строки. Это 300 000 раз, когда он вызывается в вашем запросе. –

+0

Будет ли это обновление один раз в жизни или вам нужно будет заменить Administration [number] [number] каждый раз, когда вы выберете из своей таблицы? –

ответ

1

Так что я нашел что-то вроде этого:

TSQL Regular Expression Workbench

Он имеет пользовательскую функцию, которая позволяет делать регулярные выражения Replace (не CLR) , что весьма полезно. Здесь я не буду вставлять код функции, он находится на сайте. Но прежде чем создавать его, убедитесь, чтобы запустить эти:

sp_configure 'show advanced options', 1 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1 
GO 
RECONFIGURE; 
GO 
sp_configure 'show advanced options', 1 
GO 
RECONFIGURE; 

Так что, когда я создал, что один, я побежал это выбрать, чтобы посмотреть, как она выполняет:

SELECT dbo.RegexReplace(
     'Administration([1-9][0-9]?)+' 
     , 'Administration' 
     , ' <Administration1> to <Administration> 
      <Administration2> to <Administration> 
      <Administration3> to <Administration> 
      <Administration20> to <Administration>' 
     , 1 
     , 1 
    ); 

Он выводит это в результате:

<Administration> to <Administration> 
<Administration> to <Administration> 
<Administration> to <Administration> 
<Administration> to <Administration> 

Это похоже на то, что вам нужно. Стоит посмотреть на это? Я просто не уверен, насколько результативен он по сравнению с вложенными операциями замены и не может проверить это, поскольку у меня не так много данных, как вы.
Это выглядит более простым и удобным для чтения.

+1

Выглядит многообещающе! Я добавил вашу ссылку на мои ссылки и погрузиться в нее позже. Thx для указания на это! – Shnugo

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