2011-08-04 58 views
2

我在我的應用程序中有一個用逗號分隔列表作爲參數的用戶定義函數。它分割項目並將它們插入表變量並返回結果。表變量行限制?

該函數運行良好,除了當逗號分隔列表中的項目超過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; 

回答

2

定義你的輸入變量爲varchar(8000)和你的@item變量爲varchar(8)。您的物品通常每個8個字符?您發送的字符串是否超過1000個項目超過8000個字符?嘗試將輸入更改爲varchar(max)。

+0

中邦謝謝哥們我不能相信我沒有看到,我將varchar變量增加到MAX,它的工作每個項目的7個字符的長度總是一樣的,它們之間用逗號隔開,這意味着字符串的長度總是被截斷爲1000條記錄,然而在附註中,限制是什麼nvarchar(max)? –

+0

限制是它不能被索引。 –

1

所有的逗號分隔值8個字符長嗎?如果是這樣,那麼輸入參數只能容納888(9分之8000(包括逗號)他們的..

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)) 
...