为了账号安全,请及时绑定邮箱和手机立即绑定

从SQL Server中的VARCHAR中删除非数字字符的最快方法

从SQL Server中的VARCHAR中删除非数字字符的最快方法

慕的地8271018 2019-12-12 14:10:37
我正在编写一个导入实用程序,它将电话号码用作导入中的唯一键。我需要检查数据库中是否不存在电话号码。问题在于数据库中的电话号码可能包含破折号和括号之类的内容,也可能包含其他内容。我写了一个删除这些东西的函数,问题是它很慢,并且数据库中有成千上万的记录,并且一次要导入成千上万的记录,所以此过程可能会令人难以接受。我已经将电话号码列作为索引。我尝试使用这篇文章中的脚本:T-SQL trim&nbsp(和其他非字母数字字符)但这并没有加快速度。是否有删除非数字字符的更快方法?当必须比较10,000到100,000条记录时,某些性能会很好。无论做什么都需要快速执行。更新鉴于人们的回应,我认为我将必须在运行导入实用程序之前清理字段。为了回答我在其中编写导入实用程序的问题,它是一个C#应用程序。我现在正在将BIGINT与BIGINT进行比较,而无需更改数据库数据,而我仍然会因为很少的一组数据(大约2000条记录)而对性能造成冲击。将BIGINT与BIGINT进行比较会降低速度吗?我已尽我所能优化了应用程序的代码方面(删除了正则表达式,删除了不必要的数据库调用)。尽管我无法再将SQL隔离为问题的根源,但我仍然觉得确实如此。
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

我可能会误会,但您有两组数据要从一组中删除数据库中当前数据的字符串,然后在每次导入时都从一组中删除字符串。


对于更新现有记录,我只会使用SQL,那只需要发生一次。


但是,SQL并未针对这种操作进行优化,因为您说的是编写导入实用程序,所以我将在导入实用程序本身而不是在SQL中进行这些更新。这将是更好的性能选择。您在用什么编写实用程序?


另外,我可能会完全误解该过程,因此,如果我偏离基准,我深表歉意。


编辑:

对于初始更新,如果您使用的是SQL Server 2005,则可以尝试CLR函数。这是一个使用正则表达式的快速方法。不确定性能如何进行比较,我自己从未使用过此功能,除非现在进行快速测试。


using System;  

using System.Data;  

using System.Text.RegularExpressions;  

using System.Data.SqlClient;  

using System.Data.SqlTypes;  

using Microsoft.SqlServer.Server;  


public partial class UserDefinedFunctions  

{  

    [Microsoft.SqlServer.Server.SqlFunction]  

    public static SqlString StripNonNumeric(SqlString input)  

    {  

        Regex regEx = new Regex(@"\D");  

        return regEx.Replace(input.Value, "");  

    }  

};  

部署之后,可以使用以下命令进行更新:


UPDATE table SET phoneNumber = dbo.StripNonNumeric(phoneNumber)



查看完整回答
反对 回复 2019-12-13
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我看到了带有T-SQL代码和PATINDEX的解决方案。我喜欢 :-)


CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000))

RETURNS VARCHAR(1000)

AS

BEGIN

    WHILE PATINDEX('%[^0-9]%', @strText) > 0

    BEGIN

        SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')

    END

    RETURN @strText

END




查看完整回答
反对 回复 2019-12-13
?
隔江千里

TA贡献1906条经验 获得超10个赞

replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(string,'a',''),'b',''),'c',''),'d',''),'e',''),'f',''),'g',''),'h',''),'i',''),'j',''),'k',''),'l',''),'m',''),'n',''),'o',''),'p',''),'q',''),'r',''),'s',''),'t',''),'u',''),'v',''),'w',''),'x',''),'y',''),'z',''),'A',''),'B',''),'C',''),'D',''),'E',''),'F',''),'G',''),'H',''),'I',''),'J',''),'K',''),'L',''),'M',''),'N',''),'O',''),'P',''),'Q',''),'R',''),'S',''),'T',''),'U',''),'V',''),'W',''),'X',''),'Y',''),'Z','')*1 AS string,


:)




查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 496 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信