ฉันจะตัดอักขระที่ไม่ใช่ตัวเลขออกจากสตริงได้อย่างไร


10

ผู้ใช้ป้อนคำค้นหาในกล่องและค่านั้นจะถูกส่งผ่านไปยังขั้นตอนการจัดเก็บและตรวจสอบกับเขตข้อมูลที่แตกต่างกันไม่กี่ในฐานข้อมูล ฟิลด์เหล่านี้ไม่ได้เป็นชนิดข้อมูลเดียวกันเสมอไป

หนึ่งฟิลด์ (หมายเลขโทรศัพท์) ประกอบด้วยตัวเลขทั้งหมดดังนั้นเมื่อตรวจสอบจะตัดอักขระที่ไม่ใช่ตัวเลขทั้งหมดออกจากสตริงโดยใช้ฟังก์ชัน. 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 บิตไม่ใช่ตัวเลือกสำหรับเรา

ฉันรู้ว่าการรีสตาร์ทเซิร์ฟเวอร์จะปล่อยหน่วยความจำใด ๆ ก็ตาม แต่นั่นไม่ใช่วิธีแก้ปัญหาที่ใช้งานได้ในสภาพแวดล้อมการใช้งานจริง

มีวิธีการแยกอักขระที่ไม่ใช่ตัวเลขออกจากสตริงใน SQL Server 2005 โดยใช้ T-SQL เท่านั้นหรือไม่

คำตอบ:


14

ฉันพบฟังก์ชัน 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

คำถามของฉันถามหา T-SQL ทางเลือกในการใช้ฟังก์ชัน CLR ฉันโพสต์ข้อมูล CLR พิเศษเท่านั้นเพราะคุณขอในความคิดเห็นและฉันคิดว่าคุณรู้วิธีแก้ไขปัญหา ฉันต้องการแก้ไขวิธีการ CLR แต่งานวิจัยของฉันแสดงให้เห็นว่า "การแก้ไข" คือการอัพเกรดเป็นเซิร์ฟเวอร์ 64 บิตซึ่งไม่มีตัวเลือกให้ฉันในขณะนี้ ตอนนี้ฉันรู้แล้วว่าข้อมูล CLR ทั้งหมดในคำถามอาจทำให้เข้าใจผิดดังนั้นฉันจึงลบออกจากคำถามทั้งหมด
Rachel

ฉันคิดว่าอาจเป็นวิธีที่คุณใช้ในการปรับใช้การชุมนุมหรือสร้างฟังก์ชั่นอาจให้เบาะแสบางอย่าง "นโยบายการเลื่อนระดับ" ทำให้ฉันคิดว่าอาจมีบางอย่างเกี่ยวกับความปลอดภัยหรือการเข้าถึงที่ปลอดภัย / ไม่ปลอดภัย ขออภัยฉันไม่สามารถช่วยเหลือได้มากนัก แต่บนเซิร์ฟเวอร์ 32 บิตคุณอาจใช้ T-SQL แทนได้ดีที่สุด
Aaron Bertrand

@AaronBertrand ไม่มีปัญหาขอบคุณสำหรับการป้อนข้อมูล :) เราหวังว่าจะย้ายไปยังเซิร์ฟเวอร์ 64 บิตภายในปีถัดไปหรือสองปีดังนั้นหวังว่าจะช่วยกำจัดข้อผิดพลาด CLR ได้อย่างสมบูรณ์
Rachel

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.