Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como passar array de strings no parâmetro SQL para a cláusula IN no SQL


Introdução :Mesmo que o OP já tenha aceitado uma resposta, achei melhor compartilhar minha experiência, porque acredito que a abordagem que estou prestes a mostrar é melhor do que a aceita.

Acho que a melhor maneira de passar Arrays para o banco de dados sql server é usar um user defined table type e c# DataTable .No seu caso, já que você quer passar um array de strings de uma dimensão, é bem fácil:

Primeiro você precisa criar um tipo de tabela definido pelo usuário em seu banco de dados:
 CREATE TYPE dbo.StringArray As Table (
    StringItem varchar(50) -- you can use any length suited for your needs
)

Então você precisa criar uma tabela de dados em seu código c#:
DataTable dt = new DataTable();
dt.Columns.Add("StringItem", typeof(System.String));

Em seguida, altere seu procedimento armazenado para aceitar esse tipo de dados como parâmetro:
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

Então você precisa converter a matriz de string em uma dataTable em seu código c#.
foreach (string s in YourStringArray) {
    string[] temp = {s};
    dt.Rows.Add(temp);
}

Adicione o DataTable como um parâmetro ao procedimento armazenado:
System.Data.SqlClient.SqlParameter sp = new Data.SqlClient.SqlParameter();
sp.SqlDbType = SqlDbType.Structured;
sp.Value = dt;
sp.ParameterName = "@Combo";
cmd.Parameters.Add(sp);

Construir e executar.

Essa abordagem deve ter melhor desempenho do que usar uma função sql definida pelo usuário e também pode ser usada para diferentes tipos de dados. esta é uma das melhores razões para usá-lo:Considere um cenário onde você precisa passar um array de Dates:a abordagem csv requer sql para converter cada string em uma data, enquanto com esta abordagem você pode simplesmente passar as datas como estão, sem convertê-los em strings e depois voltar para datas. Além disso, você pode passar arrays ou dicionários de 2 dimensões, tudo o que você precisa fazer é criar o tipo de dados definido pelo usuário apropriado em seu banco de dados sql.

Observação:código escrito diretamente aqui, pode haver alguns erros de digitação.