Sybase UDF 难度

问题描述

当我尝试在 Sybase ASE 15.7 上运行以下函数时,它只是无限期地旋转。该函数的每个组件似乎都按预期独立运行。这只是一种从字符串中去除所有非数字字符的机制。任何和所有想法表示赞赏。

create function dbo.mdsudf_just_digits(@str varchar(64))  
returns varchar(64)  
as  
begin  
    while patindex('%[^0-9]%',@str) > 0  
        set @str = stuff(@str,patindex('%[^0-9]%',@str),1,'')  
    return @str  
end  

-- A typical invocation would be like so:

select dbo.mdsudf_just_digits('hello123there456')
```

解决方法

在 Sybase (ASE) 中,空字符串 ('') 实际上转换为一个空格:

select '.'+''+'.'     -- period + empty string + period
go

 ---
 . .                  -- we get a space between the periods

因此,在当前的 stuff(@str,...,1,'') 中,您实际上是用一个空格替换了第一个非数字。这个“新”空格然后在下一次通过循环时匹配非数字测试,此时空格被替换为......另一个空格。这会导致无限循环,不断用空格替换第一个非数字字符。

您可以通过使用 NULL 作为 stuff() 调用的最后一个参数来解决这个问题,例如:

set @str = stuff(@str,patindex('%[^0-9]%',@str),NULL)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...