【发布时间】:2012-05-20 19:44:45
【问题描述】:
以下代码会导致无限循环或执行速度非常慢:
CREATE FUNCTION [dbo].[CleanUriPart]
(
-- Add the parameters for the function here
@DirtyUriPart nvarchar(200)
)
RETURNS nvarchar(200)
AS
BEGIN;
-- Declare the return variable here
DECLARE @Result nvarchar(200);
DECLARE @i int;
SET @i = 1;
WHILE 1 = 1
BEGIN;
SET @i = PATINDEX('%[^a-zA-Z0-9.~_-]%', @DirtyUriPart COLLATE Latin1_General_BIN);
IF @i > 0
SET @DirtyUriPart = STUFF(@DirtyUriPart, @i, 1, '-');
ELSE
BREAK;
END;
-- Add the T-SQL statements to compute the return value here
SELECT @Result = @DirtyUriPart;
-- Return the result of the function
RETURN @Result;
END;
输入/输出应如下:
- 'abcdef' -> 'abcdef' 工作正常
- 'abc-def' -> 'abc-def' 导致无限循环
- 'abc*def' -> 'abc-def' 导致无限循环
- 等
请帮忙!
【问题讨论】:
-
您永远不会在循环内更改
@DirtyUriPart,因此@i的值在后续迭代中永远不会改变。 -
不,那是我惊慌失措并弄乱我的代码。它仍然会导致无限循环。
-
看起来模式实际上可能需要更改为
'%[^-a-zA-Z0-9.~_]%'。我假设它将-视为范围语法的一部分,即使它没有 RHS。 -
啊啊啊啊太吓人了。这就是为什么我尽量避免我不理解的东西。谢谢你的帮助。 RHS 是什么意思?
-
“右手边”。我找不到任何说明如何处理没有 LHS 和 RHS 的
-符号的文档,因此需要进行一些测试以确认这一点。
标签: sql-server sql-server-2008 tsql pattern-matching user-defined-functions