Я работаю с 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>
Пожалуйста, покажите ожидаемый вывод и строку примера того, что вы пытаетесь заменить – TheGameiswar
Не используйте функцию. Функции - это убийцы производительности в sql-сервере. Вы заявили, что у вас 300 000 строк. Ваша функция вызывается для каждой строки. Это 300 000 раз, когда он вызывается в вашем запросе. –
Будет ли это обновление один раз в жизни или вам нужно будет заменить Administration [number] [number] каждый раз, когда вы выберете из своей таблицы? –