所以我试图创建我的第一个递归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中),我已经完成了。当然,它也不会那么有趣。或者充满诅咒...
答案 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