Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment passer un tableau de chaînes dans le paramètre SQL à la clause IN dans SQL

Présentation :Même si l'OP a déjà accepté une réponse, j'ai pensé qu'il serait préférable de partager mon expérience, car je crois que l'approche que je vais montrer est meilleure que celle acceptée.

Je trouve que la meilleure façon de passer des tableaux à la base de données du serveur SQL est d'utiliser un user defined table type et c# DataTable .Dans votre cas, puisque vous voulez passer un tableau de chaînes d'une dimension, c'est assez simple :

Vous devez d'abord créer un type de table défini par l'utilisateur dans votre base de données :

 CREATE TYPE dbo.StringArray As Table (
    StringItem varchar(50) -- you can use any length suited for your needs
)

Ensuite, vous devez créer une table de données dans votre code c# :

DataTable dt = new DataTable();
dt.Columns.Add("StringItem", typeof(System.String));

Modifiez ensuite votre procédure stockée pour accepter ce type de données en tant que paramètre :

ALTER proc [dbo].[sp_Accessories]
(  
@Mode varchar(50)=null,
@id int=null,
@brand varchar(50)=null,
@department varchar(MAX)=null,
@season varchar(50)=null,
@groupname varchar(MAX)=null,
@styles varchar(50)=null,
@combo dbo.StringArray Readonly=null, -- NOTE THIS CHANGE
@combo_color nvarchar(max)=null,
)
as
if @Mode='getsizewise'
begin
select Sizes,SUM(Quantity) from tbl_SizeBreakup where ([email protected]) and
([email protected]) and ([email protected]) and ([email protected]) and ([email protected]) 
and ([email protected]) and (Total_Add_Qty='Total Quantity') 
and comboColumn in(select StringItem from @Combo) -- NOTE THIS CHANGE
Group By Sizes
end

Ensuite, vous devez convertir le tableau de chaînes en un dataTable dans votre code c#.

foreach (string s in YourStringArray) {
    string[] temp = {s};
    dt.Rows.Add(temp);
}

Ajoutez le DataTable en tant que paramètre à la procédure stockée :

System.Data.SqlClient.SqlParameter sp = new Data.SqlClient.SqlParameter();
sp.SqlDbType = SqlDbType.Structured;
sp.Value = dt;
sp.ParameterName = "@Combo";
cmd.Parameters.Add(sp);

Construire et exécuter.

Cette approche devrait avoir de meilleures performances que l'utilisation d'une fonction définie par l'utilisateur sql, et peut également être utilisée pour différents types de données. c'est l'une des meilleures raisons de l'utiliser :Envisagez un scénario dans lequel vous devez transmettre un tableau de dates :l'approche csv nécessite sql pour convertir chaque chaîne en une date, alors qu'avec cette approche, vous pouvez simplement transmettre les dates telles quelles, sans les convertir en chaînes, puis revenir aux dates. De plus, vous pouvez passer un tableau ou des dictionnaires à 2 dimensions, tout ce que vous avez à faire est de créer le type de données défini par l'utilisateur approprié dans votre base de données sql.

Remarque :code écrit directement ici, il peut y avoir des fautes de frappe.