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