2009-09-30 6 views
1

Je pense que je frappe une limite. J'ai deux instructions IN dans le SQL généré par subsonic. Ou est-ce que je frappe la limite de varchar (8000)? Lorsque j'envoie i moins de paramètres, l'instruction retourne les résultats, quand j'envoie plus, l'ensemble de résultats revient vide.Quel est le nombre maximum de paramètres que je peux utiliser dans une instruction subsonique 2.1+ 'IN'?

Voici ce que je suis dans attrapais SQL Profiler:

exec sp_executesql N'/* GetDataSet() */ 
SELECT 
    [dbo].[QuoteDBAll].[quote_id], 
    [dbo].[conn_quote_result].[product_category_name], 
    part_number, 
    quote_result_special_price * (quote_result_quantity + quote_result_quantity_spare) AS Total, 
    company_name 
FROM [dbo].[QuoteDBAll] 
INNER JOIN [dbo].[conn_quote_result] 
    ON [dbo].[QuoteDBAll].[quote_number] = [dbo].[conn_quote_result].[quote_number] 
INNER JOIN [dbo].[conn_company] 
    ON [dbo].[QuoteDBAll].[company_id] = [dbo].[conn_company].[company_id] 
GROUP BY [dbo].[QuoteDBAll].[quote_id], 
    [dbo].[conn_quote_result].[product_category_name], 
    [dbo].[conn_quote_result].[part_number], 
    [dbo].[conn_quote_result].[quote_result_quantity], 
    [dbo].[conn_quote_result].[quote_result_quantity_spare], 
    [dbo].[conn_quote_result].[quote_result_special_price], 
    [dbo].[QuoteDBAll].[quote_status_id], 
    company_name 
HAVING (quote_status_id = @quote_status_id0) 
    AND (company_name IN 
    (@in1,@in2,@in3,@in4,@in5,@in6,@in7,@in8,@in9,@in10, 
    @in11,@in12,@in13,@in14,@in15,@in16,@in17,@in18,@in19,@in20, 
    @in21,@in22,@in23,@in24,@in25,@in26,@in27,@in28,@in29,@in30,@in31)) 
    AND ([dbo].[conn_quote_result].[product_category_name] IN 
    (@in1,@in2,@in3,@in4,@in5,@in6,@in7,@in8,@in9,@in10, 
    @in11,@in12,@in13,@in14,@in15,@in16,@in17,@in18,@in19,@in20, 
    @in21,@in22,@in23,@in24,@in25,@in26,@in27,@in28,@in29,@in30, 
    @in31,@in32,@in33,@in34,@in35,@in36,@in37,@in38))', 
N'@quote_status_id0 varchar(1),@## varchar(8000),@in1 varchar(15),@in2 varchar(22), 
    @in3 varchar(21),@in4 varchar(13),@in5 varchar(5),@in6 varchar(6),@in7 varchar(13), 
    @in8 varchar(25),@in9 varchar(8),@in10 varchar(14),@in11 varchar(9),@in12 varchar(11), 
    @in13 varchar(16),@in14 varchar(12),@in15 varchar(14),@in16 varchar(16), 
    @in17 varchar(11),@in18 varchar(15),@in19 varchar(6),@in20 varchar(12), 
    @in21 varchar(12),@in22 varchar(10),@in23 varchar(15),@in24 varchar(15), 
    @in25 varchar(15),@in26 varchar(11),@in27 varchar(16),@in28 varchar(20), 
    @in29 varchar(6),@in30 varchar(16),@in31 varchar(17),@in32 varchar(11), 
    @in33 varchar(18),@in34 varchar(23),@in35 varchar(14),@in36 varchar(19), 
    @in37 varchar(12),@in38 varchar(14)', 
@quote_status_id0 = '1', @## = NULL, @in1 = 'Widget1', @in2 = 'Widget2', 
@in3 = 'Widget3', @in4 = 'Widget4', @in5 = 'Widget5', @in6 = 'Widget6', @in7 = 'Widget7', 
@in8 = 'Widget7', @in9 = 'Widget7', @in10 = 'Widget8', @in11 = 'Widget9', @in12 = 'Widget10', 
@in13 = 'Widget11', @in14 = 'Widget12', @in15 = 'Widget13', @in16 = 'Widget14', 
@in17 = 'Widget15', @in18 = 'Widget16', @in19 = 'Widget17', @in20 = 'Widget18', 
@in21 = 'DWidget19', @in22 = 'Widget20', @in23 = 'Widget21', @in24 = 'Widget22', 
@in25 = 'Widget23', @in26 = 'Widget24', @in27 = 'Widget25', @in28 = 'Widget26', 
@in29 = 'Widget27', @in30 = 'Widget28', @in31 = 'Widget29', @in32 = 'Widget30', 
@in33 = 'Widget31', @in34 = 'Widget32', @in35 = 'Widget33', @in36 = 'Widget34', 
@in37 = 'Widget35', @in38 = 'Widget36' 
+0

De plus, chaque SGBD a ses propres limites sur les instructions IN. Je me souviens que j'ai rencontré ce problème avec une limitation Oracle il y a quelques années. Je pense que c'était autour de 8k, aussi. Je recommande d'utiliser une autre technique. –

Répondre

2

Si vous devez poser cette question, vous devriez probablement utiliser une table temporaire. Insérez vos paramètres dans la table temporaire et JOIN votre table principale, ou utilisez un prédicat IN() par rapport à une sous-requête de la table temporaire.

Dans la plupart des cas, lorsque vous avez plus de 30 paramètres dans un prédicat IN(), vous constaterez que vous avez besoin de plus de temps. L'utilisation d'une table temporaire vous permet d'augmenter le nombre de valeurs sans avoir à réécrire votre requête.

Et cela évite toute possibilité de toucher une limite du nombre de paramètres ou une limite de longueur de requête.

+0

Cela vaut aussi la peine d'utiliser une vue ou un –

Questions connexes