SQL Server 2008替换多个字符串Slow

时间:2016-08-23 16:35:03

标签: sql sql-server xml recursion replace

我正在使用SQL Server 2008,我正在尝试替换列中的字符串。问题是响应太慢,因为我有大量的记录:300 000行 我正在做多个替换嵌套。这是我的疑问:

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 

我尝试了递归CTE,但我不知道这是否是正确的方法:

;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

任何帮助都会受到赞赏:)

修改

预期输出

<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>

1 个答案:

答案 0 :(得分:1)

所以我发现了类似的东西:

TSQL Regular Expression Workbench

它有一个自定义函数,允许你做正则表达式替换(不是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>

它确实似乎完全符合您的需要。值得一看吗?我只是不确定它与嵌套的替换语句相比有多高效,并且无法测试,因为我没有那么多的数据。
它确实看起来更简单,更具可读性。