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


10

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

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

SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '')

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

Msg 6533,第16级,状态49,第2行
AppDomain MyDBName.dbo [runtime] .1575已由升级策略卸载,以确保 
您的应用程序的一致性。访问关键资源时发生内存不足。
System.Threading.ThreadAbortException:类型的异常 
引发了“ System.Threading.ThreadAbortException”。
System.Threading.ThreadAbortException: 

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

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

是否只有在使用T-SQL的SQL Server 2005中才能从字符串中去除非数字字符?

Answers:


14

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

我的问题是要求使用CLR函数替代T-SQL。我只发布了额外的CLR数据,因为您在注释中要求它,并且我认为您知道一种解决问题的方法。我更喜欢修复CLR方法,但是我的研究表明,“修复”是要升级到64位服务器,目前这对我来说不是可用的选项。现在我意识到问题中的所有CLR信息都可能产生误导,因此我将其从问题中完全删除。
雷切尔

我认为也许您用于部署程序集或创建函数的方法可能会产生一些线索。我认为“升级政策”可能与安全性或安全/不安全访问有关。抱歉,我没有更多帮助,但是在32位服务器上,最好使用T-SQL。
亚伦·伯特兰

@AaronBertrand没问题,谢谢您的投入:)我们确实希望在未来一两年内转移到64位服务器,因此希望可以彻底清除CLR错误。
雷切尔

0

我对此解决方案非常有信心。我不确定性能,但是绝对欢迎您提出任何意见!基本上,对于字符串@String中的每个字符,如果字符的ASCII值在ASCII值“ 0”和“ 9”之间,则将其保留,否则将其替换为空白。

CREATE FUNCTION [dbo].[fnStripNonNumerics](
             @String VARCHAR(500))
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE
          @n INT = 1,
          @Return VARCHAR(100) = ''

    WHILE @n <= LEN(@String)
       BEGIN
          SET @Return = @Return + CASE
                             WHEN ASCII(SUBSTRING(@String, @n, 1)) BETWEEN ASCII('0') AND ASCII('9')
                                THEN SUBSTRING(@String, @n, 1)
                                ELSE ''
                             END
          SET @n = @n + 1
       END

    RETURN CASE
         WHEN @Return = ''
            THEN NULL
            ELSE @Return
         END
END
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.