SQL Server函数执行 - while语句行为意外

时间:2017-08-02 10:17:11

标签: sql sql-server string while-loop

我正在使用此代码从字符串中删除非数字字符:

map(u => (u.someField)).result.map(_.headOption.match { 
  case Some(0) => .....
})

我希望如果我调用此函数,将输入字符串作为输入:

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

我更改了输入以测试此行为,我注意到它只需要第一个非数字字符序列。你能告诉我我在俯瞰什么吗?

由于

2 个答案:

答案 0 :(得分:4)

只需将返回定义更改为:

RETURNS varchar(255)

如果省略长度,则默认长度为1

答案 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