如何从字符串中去除非数字字符?

Rac*_*hel 13 sql-server-2005 sql-server t-sql

用户在一个框中输入一个搜索词,该值被传递到一个存储过程,并根据数据库中的几个不同字段进行检查。这些字段并不总是具有相同的数据类型。

一个字段(电话号码)由所有数字组成,因此在检查它时会使用 .Net CLR 函数从字符串中去除所有非数字字符。

SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '')
Run Code Online (Sandbox Code Playgroud)

问题是,此功能有时会突然停止工作,并出现以下错误:

Msg 6533, Level 16, State 49, Line 2
AppDomain MyDBName.dbo[runtime].1575 被升级策略卸载,以确保 
应用程序的一致性。访问关键资源时发生内存不足。
System.Threading.ThreadAbortException:类型异常 
'System.Threading.ThreadAbortException' 被抛出。
System.Threading.ThreadAbortException: 

我已经尝试了MSDN 上针对此错误发布的建议,但仍然遇到问题。目前,切换到 64 位服务器不是我们的选择。

我知道重新启动服务器会释放它拥有的任何内存,但这在生产环境中不是一个可行的解决方案。

有没有办法仅使用 T-SQL 从 SQL Server 2005 中的字符串中去除非数字字符?

Rac*_*hel 16

我在 SO 上发现了这个 T-SQL 函数,它可以从字符串中删除非数字字符。

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)


小智 5

这效果更好:

SELECT
    (SELECT CAST(CAST((
        SELECT SUBSTRING(FieldToStrip, Number, 1)
        FROM master..spt_values
        WHERE Type='p' AND Number <= LEN(FieldToStrip) AND
            SUBSTRING(FieldToStrip, Number, 1) LIKE '[0-9]' FOR XML Path(''))
    AS xml) AS varchar(MAX)))
FROM
    SourceTable
Run Code Online (Sandbox Code Playgroud)