用于删除非字母数字字符的递归SQL UDF
因此,我尝试创建我的第一个递归udf(使用MS SQL)来从字符串中去除除字母和数字以外的任何内容 这是受到这篇文章的启发() 这是一个更大问题中的一步,我试图将一个可能是XXX#####YYYY的字符串拆分为三个部分,其中一些部分可能缺失 我正在尝试不使用while循环(该解决方案已经存在,但运行缓慢)用于删除非字母数字字符的递归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
如果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