0

当我尝试在 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')
```
4

1 回答 1

1

在 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), 1, NULL)
于 2021-06-25T13:37:25.653 回答