2017-08-02 53 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

为什么选择投票? –