2011-08-04 3 views
2

J'ai dans mon application une fonction définie par l'utilisateur qui prend une liste séparée par des virgules comme argument. Il divise les éléments et les branche dans une variable de table et renvoie le résultat.Limitation de ligne variable de table?

Cette fonction fonctionne bien, sauf que lorsque les éléments de la liste séparée par des virgules dépassent 1000, elle ignore le reste. C'est-à-dire, si je branche en 1239, les 1000 premières lignes seront retournées et les 239 restantes seront entièrement ignorées. Il n'y a pas d'erreurs quand cela se produit.

Je ne peux m'empêcher de penser que cela est dû à une sorte de limitation que je devrais connaître, mais je n'arrive pas à trouver d'informations à ce sujet. Est-ce une limitation sur la quantité de lignes qui peuvent être stockées dans une variable de table? Ou est-ce que je manque quelque chose dans le code lui-même? Quelqu'un peut-il aider? Aller aux yeux écarquillés ici.

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; 

Répondre

2

Vous définissez votre variable d'entrée comme varchar (8000) et votre variable @Item est varchar (8). Vos éléments sont généralement de 8 caractères chacun? La chaîne que vous envoyez contient-elle plus de 1000 éléments de plus de 8000 caractères? Essayez de changer votre entrée en varchar (max) à la place.

+0

Bang sur Merci mon pote, je ne peux pas croire que je ne vois pas que j'augmenté la variable varchar MAX et cela a fonctionné Chacun des articles sont 7 Ils sont séparés par une seule virgule, ce qui signifie que la longueur de la chaîne a toujours été tronquée à exactement 1000 enregistrements. de nvarchar (max)? –

+0

La limite est qu'il ne peut pas être indexé. –

1

Est-ce que toutes vos valeurs séparées par des virgules sont de 8 caractères? Si oui, alors le paramètre d'entrée ne sera en mesure de tenir 888 (8000/9 (y compris la virgule) d'entre eux ..

1

Il est parce que votre paramètre d'entrée est limité à 8000 caractères. Vous

peut-être essayer d'appeler la fonction à l'aide ... peut-être sous-chaîne:...

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