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

时间:2014-03-27 15:03:10

标签: sql sql-server recursive-query

所以我试图创建我的第一个递归udf(使用MS SQL)来删除字符串中不包含字母和数字的任何内容。

这受到了这篇文章的启发(Replace with wildcard, in SQL

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

    IF @p_CharIndex > 0
      BEGIN
        EXEC @p_Value = uf_RemoveNonAlphaNumericChar @p_CharIndex = @p_CharIndex,
              @p_Value = @p_Value
      END 
    RETURN @p_Value
END

这是一个更大问题中的一个步骤,我试图将一些可能XXX###YYYY的字符串分成三个部分,而某些部分可能会丢失。

我试图在没有while循环的情况下这样做(该解决方案已经存在,但运行缓慢)。

如果Patindex有一个起始位置(在MS SQL中),我已经完成了。当然,它也不会那么有趣。或者充满诅咒...

2 个答案:

答案 0 :(得分:0)

我找到了你的问题。你删除符号,即使你没有找到它;) 看看更新的答案:

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

答案 1 :(得分:-1)

是否必须递归?

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