【问题标题】:Sybase UDF difficultySybase UDF 难度
【发布时间】:2021-06-24 21:32:16
【问题描述】:

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

【问题讨论】:

    标签: user-defined-functions sap-ase sybase-ase15


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2011-02-24
      • 2018-01-08
      • 1970-01-01
      相关资源
      最近更新 更多