Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come passare l'array di stringhe nel parametro SQL alla clausola IN in SQL

Introduzione :Anche se l'OP ha già accettato una risposta, ho pensato che sarebbe stato meglio condividere la mia esperienza, perché credo che l'approccio che sto per mostrare sia migliore di quello accettato.

Trovo che il modo migliore per passare gli array al database del server sql sia utilizzare un user defined table type e c# DataTable .Nel tuo caso, dal momento che vuoi passare un array di stringhe di una dimensione, è abbastanza semplice:

Per prima cosa devi creare un tipo di tabella definito dall'utente nel tuo database:

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

Quindi devi creare un datatable nel tuo codice c#:

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

Quindi modifica la procedura memorizzata per accettare questo tipo di dati come parametro:

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

Quindi è necessario convertire l'array di stringhe in un dataTable nel codice c#.

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

Aggiungi DataTable come parametro alla stored procedure:

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

Crea ed esegui.

Questo approccio dovrebbe avere prestazioni migliori rispetto all'utilizzo di una funzione definita dall'utente sql e può essere utilizzato anche per diversi tipi di dati. questo è uno dei migliori motivi per usarlo:Considera uno scenario in cui devi passare un array di Date:l'approccio csv richiede sql per convertire ogni stringa in una data, mentre con questo approccio puoi semplicemente passare le date così come sono, senza convertirli in stringhe e poi di nuovo in date. Inoltre, puoi passare 2 dimensioni array o dizionari, tutto ciò che devi fare è creare il tipo di dati definito dall'utente appropriato nel tuo database sql.

Nota:codice scritto direttamente qui, potrebbero esserci degli errori di battitura.