web-dev-qa-db-ja.com

文字列から数値以外の文字を削除するにはどうすればよいですか?

ユーザーがボックスに検索語を入力すると、その値がストアドプロシージャに渡され、データベースのいくつかの異なるフィールドに対してチェックされます。これらのフィールドは、常に同じデータ型であるとは限りません。

1つのフィールド(電話番号)はすべての数字で構成されているため、チェックすると、.Net CLR関数を使用して文字列からすべての非数値文字が削除されます。

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

問題は、この関数が次のエラーで突然動作を停止することです。

メッセージ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で文字列から非数値文字を取り除く方法はありますか?

10
Rachel

文字列から数値以外の文字を削除する このT-SQL関数 が見つかりましたSO.

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
14
Rachel

私はこのソリューションにかなり自信があります。パフォーマンスについては確信が持てませんが、このアプローチについての意見は大歓迎です。基本的に、文字列@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
0
mateoc15