2017-08-02 35 views
1

我使用此代碼從一個字符串中刪除非數字字符:SQL Server函數的執行 - while語句行爲意外

ALTER FUNCTION [dbo].[StripNonNumerics](@Temp VARCHAR(255)) 
RETURNS VARCHAR 
AS 
BEGIN 
    DECLARE @KeepValues AS VARCHAR(50); 
    SET @KeepValues = '%[^0-9]%'; 

    WHILE PATINDEX(@KeepValues, @Temp) > 0 
    BEGIN 
     SET @Temp = STUFF(@Temp, PATINDEX(@KeepValues, @Temp), 1, ''); 
    END 

    RETURN @Temp 
END; 

我想到,如果我調用該函數,將輸入的字符串這樣之一:

select [dbo].[StripNonNumerics]('vAn34nd2') 

我能得到這樣的輸出:

342 

相反,我得到:

3 

我改變了輸入來測試這種行爲,我注意到它只需要第一個非數字字符序列。你能告訴我我忽略了什麼嗎?

感謝

+3

[*壞習慣踢*:聲明VARCHAR沒有(長度)](http://sqlblog.com/ blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx) - 你應該**總是爲任何'varchar'變量和參數提供一個長度你用。否則,它們可能最終成爲**默認長度**,如果參數或返回值爲** 1 CHARACTER ** ..... –

回答

4

只是改變返回定義爲:

RETURNS varchar(255) 

如果省略長度,則默認長度爲1

2

我只是增加一個做的另一種方式以上..

DECLARE @X VARCHAR(100)='vAn34nd2', @Y VARCHAR(100)='' 

SELECT @Y = @Y+ VAL FROM(
SELECT SUBSTRING(@X,number,1) AS VAL 
FROM master.dbo.spt_values 
WHERE type='P' AND number BETWEEN 1 AND LEN(@X) 
AND ISNUMERIC(SUBSTRING(@X,number,1))=1 
)A 

SELECT @Y 
+0

爲什麼選擇投票? –