Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于删除非字母数字字符的递归SQL UDF_Sql_Sql Server_Recursive Query - Fatal编程技术网

用于删除非字母数字字符的递归SQL UDF

用于删除非字母数字字符的递归SQL UDF,sql,sql-server,recursive-query,Sql,Sql Server,Recursive Query,因此,我尝试创建我的第一个递归udf(使用MS SQL)来从字符串中去除除字母和数字以外的任何内容 这是受到这篇文章的启发() 这是一个更大问题中的一步,我试图将一个可能是XXX#####YYYY的字符串拆分为三个部分,其中一些部分可能缺失 我正在尝试不使用while循环(该解决方案已经存在,但运行缓慢) 如果Patindex有一个起始位置(在MS SQL中),我就已经完成了。当然,这也没有那么有趣。或者,作为充满诅咒的…它必须是递归吗 CREATE FUNCTION [dbo].[uf_Rem

因此,我尝试创建我的第一个递归udf(使用MS SQL)来从字符串中去除除字母和数字以外的任何内容

这是受到这篇文章的启发()

这是一个更大问题中的一步,我试图将一个可能是XXX#####YYYY的字符串拆分为三个部分,其中一些部分可能缺失

我正在尝试不使用while循环(该解决方案已经存在,但运行缓慢)


如果Patindex有一个起始位置(在MS SQL中),我就已经完成了。当然,这也没有那么有趣。或者,作为充满诅咒的…

它必须是递归吗

CREATE FUNCTION [dbo].[uf_RemoveNonAlphaNumericChar]
(
    @val varchar(max)
)
RETURNS varchar(1000)
AS
BEGIN
    DECLARE @s VARCHAR(max), @i INT
    SET @s = @val

    SET @i = PATINDEX('%[^a-z0-9]%', @s)
    WHILE @i > 0
    BEGIN
       SET @s = REPLACE(@s, SUBSTRING(@s, @i, 1), '')
       SELECT @i = PATINDEX('%[^a-z0-9]%', @s)
    END

    RETURN @s

END

我发现了你的问题。即使找不到符号,也可以删除它;) 请看更新的答案:

CREATEFUNCTION uf_RemoveNonAlphaNumericChar(
                   @p_CharIndex int,
                   @p_Value Varchar(max) )
    RETURNS varchar(max)
AS
BEGIN
    SET @p_CharIndex = PATINDEX('%[^0-9,a-z]%', @p_Value)


    IF @p_CharIndex > 0
      BEGIN
        SET @p_Value = STUFF(@p_Value,@p_CharIndex , 1, SPace(0) ) 
        EXEC @p_Value = uf_RemoveNonAlphaNumericChar @p_CharIndex = @p_CharIndex,
              @p_Value = @p_Value
      END 
    RETURN @p_Value
END

问题是使用while循环的解决方案已经存在,并且他们正在尝试在不使用while循环的情况下找到解决方案,因为它运行缓慢。但是使用recursiove函数只会进一步降低速度。就性能而言,最好的解决方案是SQL CLR,然后是这个。如果我正确地消化了我的研究,我需要做的是将这个函数修改为表值,这样我就可以将它用于交叉应用交叉应用只是一个具有奇特名称的RBAR。如果您需要最佳性能,对于几乎所有与字符串相关的内容,请使用SQL CLR UDF(开销小得多)。有大量的示例和现成的解决方案。我针对递归UDF测试了上述内容,每次测试都会在5秒内返回相同的90173行。仅供参考
PATINDEX
可以有一个开始位置:
PATINDEX('%[^0-9,a-z]',子字符串(@p_Value,2,9999))
将在字符串中的字符2处开始搜索
CREATEFUNCTION uf_RemoveNonAlphaNumericChar(
                   @p_CharIndex int,
                   @p_Value Varchar(max) )
    RETURNS varchar(max)
AS
BEGIN
    SET @p_CharIndex = PATINDEX('%[^0-9,a-z]%', @p_Value)


    IF @p_CharIndex > 0
      BEGIN
        SET @p_Value = STUFF(@p_Value,@p_CharIndex , 1, SPace(0) ) 
        EXEC @p_Value = uf_RemoveNonAlphaNumericChar @p_CharIndex = @p_CharIndex,
              @p_Value = @p_Value
      END 
    RETURN @p_Value
END