Paramètres de la clause EXISTS dans une procédure stockée

J'ai une table DEPT , qui contient 2 colonnes – ID, NAME .

Un formulaire de search est présenté avec les ID de la table DEPT et l'user peut choisir n'importe quel nombre d'ID et soumettre le formulaire, pour get les NAMEs associés.

Clarification / Entrées:

  • Je ne veux pas créer une requête dynamic – ce n'est pas gérable.
  • Je préfère une procédure stockée utilisant des parameters de table

D'autres solutions pour continuer?

REMARQUE:
Cet exemple est simple avec 1 table – dans la vraie vie, je dois gérer plus de 6 tables!

Merci pour vos suggestions

 CREATE TYPE dbo.DeptList AS TABLE ( ID INT ); GO CREATE PROCEDURE dbo.ResortingeveDepartments @dept_list AS dbo.DeptList READONLY AS BEGIN SET NOCOUNT ON; SELECT Name FROM dbo.table1 WHERE ID IN (SELECT ID FROM @dept) UNION ALL SELECT Name FROM dbo.table2 WHERE ID IN (SELECT ID FROM @dept) -- ... END GO 

Maintenant, dans votre code C #, créez un DataTable, remplissez-le avec les ID et transmettez-le à la procédure stockée. En supposant que vous avez déjà une list appelée tempList et les ID sont stockés dans l'ID:

 DataTable tvp = new DataTable(); tvp.Columns.Add(new DataColumn("ID")); foreach(var item in tempList) { tvp.Rows.Add(item.id); } using (connObject) { SqlCommand cmd = new SqlCommand("StoredProcedure", connObject); cmd.CommandType = CommandType.StoredProcedure; SqlParameter tvparam = cmd.Parameters.AddWithValue("@dept_list", tvp); tvparam.SqlDbType = SqlDbType.Structured; ... } 

Vous pouvez également utiliser une fonction de partage. Beaucoup existent, c'est celui que j'aime si vous pouvez garantir que l'input est sûre (pas <,>, & etc.):

 CREATE FUNCTION dbo.SplitInts_XML ( @List VARCHAR(MAX), @Delimiter CHAR(1) ) RETURNS TABLE AS RETURN ( SELECT Item = yivalue('(./text())[1]', 'int') FROM ( SELECT x = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.') ) AS a CROSS APPLY x.nodes('i') AS y(i) ); GO 

Maintenant, votre procédure peut être:

 CREATE PROCEDURE dbo.ResortingeveDepartments @dept_list VARCHAR(MAX) AS BEGIN SET NOCOUNT ON; ;WITH d AS (SELECT ID = Item FROM dbo.SplitInts(@dept_list, ',')) SELECT Name FROM dbo.table1 WHERE ID IN (SELECT ID FROM d) UNION ALL SELECT Name FROM dbo.table2 WHERE ID IN (SELECT ID FROM d) -- ... END GO