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


10

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

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で文字列から数値以外の文字を取り除く方法はありますか?

回答:


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問題ありません。入力に感謝します:)今後1〜2年以内に64ビットサーバーに移行する予定です。CLRエラーが完全に解消されることを願っています。
レイチェル

0

私はこの解決策にかなり自信があります。パフォーマンスについては確信が持てませんが、このアプローチについての意見は大歓迎です。基本的に、文字列@Stringの各文字について、文字のASCII値が「0」と「9」のASCII値の間にある場合はそれを保持し、それ以外の場合は空白に置き換えます。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.