Bonjour,

J'ai une procédure stockée avec un paramètre de type varchar qui permet de passer une "liste".

Je souhaite avoir vos avis concernant l'utilisation ou non de sql dynamique pour les performance d'exécution de la procédure stockée.

Exemple : le 1er paramètre contient une liste d'une centaine d'éléments et le second 2-3 éléments et souvent les mêmes
Dans le 1er cas, j'utilise un fonction SPLIT qui retourne une table

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
CREATE PROC TEST @param1 varchar(max), @param2 varchar(max)
BEGIN
  SELECT * 
  FROM ma_Table
     INNER JOIN monSPLIT(@param1) s1 ON s1.value = ma_Table.value1
     INNER JOIN monSPLIT(@param2) s2 ON s2.value = ma_Table.value2
END
Dans le 2nd cas, j'utilise du sql dynamique

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE PROC TEST @param1 varchar(max), @param2 varchar(max)
DECLARE 
  @vCmd nvarchar(MAX),
  @vStatemt nvarchar(500)
BEGIN
  SET @vCmd = 'SELECT * 
  FROM ma_Table
    INNER JOIN monSPLIT(@param1) s1 ON s1.value = ma_Table.value1
  WHERE ma_Table.value IN ( ' + @param2 + ') '
 
  SET @vStatemt = N'@pparam1 VARCHAR(max)';
  EXEC sp_executesql @vCmd, @vStatemt, @pparam1=@param1;	
END
J'ai remarqué que le second cas était plus rapide à l'exécution, néanmoins, certaines personnes me déconseillent d'utiliser du sql dynamique.
Quels sont vos avis? en fait c'est le SPLIT qui renvoie une TABLE qui est trop gourmand (jointure en plus) avez-vous une autre solution?

merci