表变量行限制?

时间:2011-08-04 17:18:48

标签: sql sql-server sql-server-2005

我的应用程序中有一个用户定义的函数,它以逗号分隔的列表作为参数。它拆分项目并将它们插入表变量并返回结果。

此功能运行良好,但当逗号分隔列表中的项目超过1000时,它会忽略余数。也就是说,如果我插入1239,将返回前1000行,其余239完全被忽略。发生这种情况时没有错误。

我不禁觉得这是由于某些我应该知道的限制,但我似乎无法找到任何有关它的信息。它是否可以存储在表变量中的行数限制?或者我在实际代码本身中遗漏了什么?有人可以帮忙吗?在这里悄悄地说。

ALTER FUNCTION [dbo].[ufnConvertArrayToIntTable] (@IntArray VARCHAR(8000))
RETURNS @retIntTable TABLE
(
    ID int
)
AS
BEGIN
DECLARE @Delimiter char(1)
SET @Delimiter = ','

DECLARE @Item varchar(8)
IF CHARINDEX(@Delimiter,@IntArray,0) <> 0
    BEGIN   
    WHILE CHARINDEX(@Delimiter,@IntArray,0) <> 0
        BEGIN
        SELECT
            @Item = RTRIM(LTRIM(SUBSTRING(@IntArray,1,CHARINDEX(@Delimiter,@IntArray,0)-1))),
            @IntArray = RTRIM(LTRIM(SUBSTRING(@IntArray,CHARINDEX(@Delimiter,@IntArray,0)+1,LEN(@IntArray))))
            IF LEN(@Item) > 0
                INSERT INTO @retIntTable SELECT @Item
        END
        IF LEN(@IntArray) > 0
            INSERT INTO @retIntTable SELECT @IntArray
    END
ELSE
    BEGIN
    IF LEN(@IntArray) > 0
        INSERT INTO @retIntTable SELECT @IntArray
    END
    RETURN  
END;

3 个答案:

答案 0 :(得分:2)

您将输入变量定义为varchar(8000),并且@Item变量为varchar(8)。您的商品通常每个8个字符吗?您发送的字符串是否超过1000个字符超过8000个字符?请尝试将输入更改为varchar(max)。

答案 1 :(得分:1)

你的所有逗号分隔值都是8个字符长吗?如果是这样,那么输入参数将只能容纳888(8000/9(包括逗号)...

答案 2 :(得分:1)

这是因为您的输入参数限制为8000个字符。

您可以尝试使用子字符串调用该函数...也许:

WHERE 
[myField] IN(Select ID from [dbo].[ufnConvertArrayToIntTable](substring(@inputarray, 1, 4000))
OR
[myField] IN(Select ID from [dbo].[ufnConvertArrayToIntTable](substring(@inputarray, 4001, 8000))
...