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

Dan*_*ert 60 sql sql-server optimization performance

我正在编写一个导入实用程序,它使用电话号码作为导入中的唯一键.

我需要检查我的数据库中是否存在电话号码.问题是数据库中的电话号码可能包含破折号和括号以及其他可能的内容.我写了一个函数来删除这些东西,问题是它很,我的数据库中有数千条记录,一次导入数千条记录,这个过程可能会慢得令人无法接受.我已经将电话号码列作为索引.

我尝试使用这篇文章中的脚本:
T-SQL trim (以及其他非字母数字字符)

但这并没有加快速度.

有没有更快的方法来删除非数字字符?当需要比较10,000到100,000条记录时,可以表现良好的东西.

无论做什么都需要快速执行.

更新
根据人们的回应,我想在运行导入实用程序之前我必须清理字段.

要回答我正在编写导入实用程序的问题,它是一个C#应用程序.我现在正在将BIGINT与BIGINT进行比较,不需要改变数据库数据,而且我仍然使用一小组数据(大约2000条记录)来获得性能.

比较BIGINT和BIGINT会减慢速度吗?

我尽可能地优化了我的应用程序的代码端(删除了正则表达式,删除了不必要的数据库调用).虽然我不能再将SQL作为问题的根源来隔离,但我仍然觉得它是.

Dav*_*ter 103

我用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
Run Code Online (Sandbox Code Playgroud)


小智 37

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,

:)

  • 爱它!这就是我对SQL语言又爱又恨的原因。 (5认同)
  • 嗨,老兄!我一生中见过的最实用的解决方案:)) (4认同)
  • 您忘记了()-#个等 (2认同)

Sco*_*ols 16

我可能会误解,但是您有两组数据可以从数据库中删除一个数据库中的当前数据,然后在导入时删除一个新数据集.

为了更新现有记录,我只使用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, "");  
    }  
};  
Run Code Online (Sandbox Code Playgroud)

部署完成后,要更新,您可以使用:

UPDATE table SET phoneNumber = dbo.StripNonNumeric(phoneNumber)
Run Code Online (Sandbox Code Playgroud)


小智 16

如果您不想创建函数,或者您只需要在T-SQL中进行一次内联调用,您可以尝试:

set @Phone = REPLACE(REPLACE(REPLACE(REPLACE(@Phone,'(',''),' ',''),'-',''),')','')
Run Code Online (Sandbox Code Playgroud)

当然这特定于删除电话号码格式,而不是通用删除字符串函数中的所有特殊字符.


小智 10

功能简单:

CREATE FUNCTION [dbo].[RemoveAlphaCharacters](@InputString VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
  WHILE PATINDEX('%[^0-9]%',@InputString)>0
        SET @InputString = STUFF(@InputString,PATINDEX('%[^0-9]%',@InputString),1,'')     
  RETURN @InputString
END

GO
Run Code Online (Sandbox Code Playgroud)


小智 6

create function dbo.RemoveNonNumericChar(@str varchar(500))  
returns varchar(500)  
begin  
declare @startingIndex int  
set @startingIndex=0  
while 1=1  
begin  
    set @startingIndex= patindex('%[^0-9]%',@str)  
    if @startingIndex <> 0  
    begin  
        set @str = replace(@str,substring(@str,@startingIndex,1),'')  
    end  
    else    break;   
end  
return @str  
end

go  

select dbo.RemoveNonNumericChar('aisdfhoiqwei352345234@#$%^$@345345%^@#$^')  
Run Code Online (Sandbox Code Playgroud)