我有一个奇怪的问题,只是偶尔发生。我已经运行了 10000 次,在不同的时间出现 2 个错误、12 个错误和没有错误。
这是我的测试脚本,它尝试了 10000 次并输出错误的脚本
declare @i int
set @i = 10000
declare @v varchar(200)
while @i > 0
begin
SELECT top 1 @v = val
FROM f_split_string('a,b,c,d,e,f',',')
if @v != 'a'
print @v
set @i = @i - 1
end
这是f_split_string
功能:
CREATE FUNCTION [dbo].[f_split_string] (@s nvarchar(max), @delim nvarchar(10))
-- returns a table from a delimited string
-- Parameters:
-- @s The delimited string
-- @delim The delimiter characters
-- Example:
-- SELECT val FROM f_split_string('a b c',' ')
RETURNS @t TABLE (id int, val nvarchar(max))
AS
BEGIN
DECLARE @c int, @v nvarchar(max)
SET @c = 1
SET @v = dbo.f_element(@s, @delim, @c)
WHILE @v IS NOT NULL
BEGIN
INSERT INTO @t (id,val) VALUES (@c,@v)
SET @c = @c + 1
SET @v = dbo.f_element(@s, @delim, @c)
END
RETURN
END
这是f_element
功能:
CREATE FUNCTION [dbo].[f_element](@Input varchar(max), @Delimiter varchar(10), @ElementNumber int)
-- returns an element from a delimited string
-- Example:
-- SELECT dbo.f_element('abc|def|ghij', '|', 2)
-- will return the 2nd element - def
RETURNS varchar(max)
AS
BEGIN
DECLARE @Pointer INT, @Count INT, @Last INT, @retVal varchar(max)
SET @Pointer = 1
SET @Count = 1
SET @Last = 1
WHILE (@Count < @ElementNumber)
BEGIN
SET @Pointer = CHARINDEX(@Delimiter,@Input,@Pointer)
IF @Pointer = 0
BREAK
SET @Pointer = @Pointer + DATALENGTH(@Delimiter)
SET @Count = @Count + 1
END
IF @Pointer = 0 OR @ElementNumber < 1
SET @retVal = null;
ELSE IF SUBSTRING(@Input,@Pointer,DATALENGTH(@Delimiter)) = @Delimiter
SET @retVal = '';
ELSE
BEGIN
SET @Last = @Pointer
SET @Pointer = CHARINDEX(@Delimiter,@Input,@Last+1)
IF @Pointer = 0
SET @retVal = SUBSTRING(@Input, @Last, 9999)
ELSE
SET @retVal = SUBSTRING(@Input, @Last, @Pointer - @Last)
END
RETURN @retVal
END
这正在 SQL Server 2008(不是 R2)上进行测试
首先,其他人是否会在我的测试脚本中出现错误,其次,为什么会发生这种情况?
我已经运行 f_element 函数 200000 次没有问题,所以怀疑 f_split_string 函数,但它可能是从 f_split_string 调用时的 f_element 函数
我在单用户 SQL Server 2008 R2 上运行它没有问题,2008 有多个用户
有谁能够帮我
错误是分隔字符串的错误部分。它应该是a,但有时它是其他部分。就好像这些行以错误的顺序插入到临时表中一样。我将 id 列添加到临时表中,以便对输出进行排序,但没有任何区别。