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:
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