Bagaimana saya bisa menghapus karakter non-numerik dari string?

10

Pengguna memasukkan istilah pencarian dalam sebuah kotak, dan nilai itu diteruskan ke prosedur tersimpan dan diperiksa terhadap beberapa bidang yang berbeda dalam database. Bidang-bidang ini tidak selalu dari tipe data yang sama.

Satu bidang (nomor telepon) terdiri dari semua angka, jadi ketika memeriksa itu menghapus semua karakter non-numerik dari string menggunakan fungsi .Net CLR.

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

Masalahnya adalah, fungsi ini tiba-tiba berhenti berfungsi pada kesempatan dengan kesalahan berikut:

Msg 6533, Level 16, State 49, Line 2
AppDomain MyDBName.dbo [runtime] .1575 diturunkan oleh kebijakan eskalasi untuk memastikan 
konsistensi aplikasi Anda. Kehabisan memori terjadi saat mengakses sumber daya kritis.
System.Threading.ThreadAbortException: Pengecualian jenis 
'System.Threading.ThreadAbortException' dilemparkan.
System.Threading.ThreadAbortException: 

Saya sudah mencoba saran yang diposting di MSDN untuk kesalahan ini, tetapi saya masih mendapatkan masalah. Saat ini, beralih ke server 64-bit bukanlah pilihan bagi kami.

Saya tahu me-restart server melepaskan memori apa pun yang dipegangnya, tetapi itu bukan solusi yang layak di lingkungan produksi.

Apakah ada cara untuk menghapus karakter non-numerik dari string di SQL Server 2005 menggunakan T-SQL saja?

Rachel
sumber

Jawaban:

14

Saya menemukan fungsi T-SQL ini pada SO yang berfungsi untuk menghapus karakter non-numerik dari string.

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
Rachel
sumber
Pertanyaan saya adalah meminta alternatif T-SQL untuk menggunakan fungsi CLR. Saya hanya memposting data CLR tambahan karena Anda memintanya di komentar, dan saya pikir Anda tahu cara untuk memperbaiki masalah. Saya lebih suka memperbaiki metode CLR, namun penelitian saya menunjukkan bahwa "perbaikan" adalah untuk meng-upgrade ke server 64-bit, yang bukan merupakan pilihan yang tersedia untuk saya saat ini. Saya menyadari sekarang bahwa semua info CLR dalam pertanyaan dapat menyesatkan, jadi saya menghapusnya sepenuhnya dari pertanyaan saya.
Rachel
Saya pikir mungkin metode yang Anda gunakan untuk menyebarkan perakitan atau membuat fungsi mungkin menghasilkan beberapa petunjuk. "Kebijakan eskalasi" membuat saya berpikir itu mungkin ada hubungannya dengan keamanan atau akses yang aman / tidak aman. Maaf saya tidak bisa membantu, tetapi pada server 32-bit Anda mungkin lebih baik menggunakan T-SQL.
Aaron Bertrand
@ AaronBertrand Tidak masalah, terima kasih atas masukannya :) Kami berharap dapat pindah ke server 64-bit dalam satu atau dua tahun ke depan, jadi semoga itu akan menghapus kesalahan CLR sepenuhnya.
Rachel
0

Saya cukup percaya diri dalam solusi ini. Saya tidak yakin tentang kinerja tetapi pendapat tentang pendekatan ini pasti diterima! Pada dasarnya untuk setiap karakter dalam string @ Strtring jika nilai ASCII karakter adalah antara nilai ASCII '0' dan '9' kemudian simpan, jika tidak gantilah dengan yang kosong.

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
mateoc15
sumber