问题描述
当我尝试在 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)