Comment créer une procédure stockée avec un set IN créé dynamicment

J'ai un certain SQL que je convertis en procédures stockées par l'exigence aveugle / request. Il y a un peu de SQL dans l'application que je regarde qui construit la clause where avec une instruction IN (set) dynamic. J'ai recherché la procédure stockée dynamic mais rien de proche de ce que je cherche est venu pour moi. Voici un exemple de la clause WHERE:

WHERE Var.A = @Param AND Var.Id IN 

A partir de là, le SQL est construit manuellement en utilisant un constructor de string, puis exécuté. Je ne sais pas comment je convertirais cela en procédure stockée car je suis assez nouveau pour eux.

Nous utilisons C # et SQL Server

Vous pouvez utiliser un type de données défini par l'user.

Du côté C #, cela ressemblerait à ceci:

 //Setup a DataTable with the same structure as the SQL Type var data = new DataTable(); data.Columns.Add("value", typeof(ssortingng)); //Populate the table data.Rows.Add("oneID"); data.Rows.Add("anotherID"); //You create your sql command cmd.Parameters.Add("@listArgument", data); //Command execution 

Du côté SQL, vous pourriez avoir un type comme celui-ci

 CREATE TYPE [dbo].[NVarCharTable] AS TABLE ( [value] NVARCHAR(MAX) NOT NULL); 

Et puis la procédure stockée:

 CREATE PROCEDURE [dbo].[MyProc] @listArgument NVarCharTable READONLY AS BEGIN SELECT * FROM FOO WHERE Var.Id IN (Select [value] FROM @listArgument) END 

Référence: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters

Si vous utilisez SQl SERVER 2016 ou supérieur, vous pouvez utiliser la fonction ssortingng_split pour convertir les parameters csv en table, puis les utiliser dans votre list IN

par exemple

 SELECT * FROM TBL WHERE Var.A = @Param AND Var.Id IN (SELECT value FROM STRING_SPLIT(@inlist, ',')) 

J'espère que cela t'aides

Pour revenir à @lostmylogin, vous pouvez passer un paramètre délimité et utiliser l'une de ces fonctions SQL pour l'parsingr dans une table:

http://sqlservercentral.com/scripts/SUBSTRING/124330 ou http://sqlservercentral.com/scripts/Miscellaneous/31913