ユーザーがボックスに検索語を入力すると、その値がストアドプロシージャに渡され、データベースのいくつかの異なるフィールドに対してチェックされます。これらのフィールドは、常に同じデータ型であるとは限りません。
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で文字列から非数値文字を取り除く方法はありますか?
文字列から数値以外の文字を削除する この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
私はこのソリューションにかなり自信があります。パフォーマンスについては確信が持てませんが、このアプローチについての意見は大歓迎です。基本的に、文字列@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