Sql-Server

如何從字元串中去除非數字字元?

  • August 27, 2020

使用者在一個框中輸入一個搜尋詞,該值被傳遞到一個儲存過程,並根據數據庫中的幾個不同欄位進行檢查。這些欄位並不總是具有相同的數據類型。

一個欄位(電話號碼)由所有數字組成,因此在檢查時會使用 .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 中的字元串中去除非數字字元?

我在 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

這效果更好:

SELECT
   (SELECT CAST(CAST((
       SELECT SUBSTRING(FieldToStrip, Number, 1)
       FROM master..spt_values
       WHERE Type='p' AND Number <= LEN(FieldToStrip) AND
           SUBSTRING(FieldToStrip, Number, 1) LIKE '[0-9]' FOR XML Path(''))
   AS xml) AS varchar(MAX)))
FROM
   SourceTable

引用自:https://dba.stackexchange.com/questions/21166