Ограничение строки таблицы? - PullRequest
2 голосов
/ 04 августа 2011

В моем приложении есть пользовательская функция, которая принимает список через запятую в качестве аргумента. Он разделяет элементы и вставляет их в переменную таблицы и возвращает результат.

Эта функция работает хорошо, за исключением того, что когда элементы в списке через запятую превышают 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 ]

2 голосов
/ 04 августа 2011

Вы определяете входную переменную как varchar (8000), а ваша переменная @Item - varchar (8). Ваши вещи обычно 8 символов каждый? Является ли строка, которую вы отправляете, в количестве более 1000 элементов более 8000 символов? Вместо этого попробуйте изменить ваш ввод на varchar (max).

1 голос
/ 04 августа 2011

Это потому, что ваш входной параметр ограничен 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))
...
1 голос
/ 04 августа 2011

Все ваши значения, разделенные запятыми, имеют длину 8 символов? Если это так, то входной параметр сможет содержать только 888 (8000/9 (включая запятую) из них ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...