sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo pasar una matriz de cadenas en el parámetro SQL a la cláusula IN en SQL

Introducción :Aunque el OP ya aceptó una respuesta, pensé que sería mejor compartir mi experiencia, porque creo que el enfoque que estoy a punto de mostrar es mejor que el aceptado.

Encuentro que la mejor manera de pasar Arrays a la base de datos del servidor sql es usando un user defined table type y c# DataTable .En su caso, dado que desea pasar una matriz de cadenas de una dimensión, es bastante fácil:

Primero necesita crear un tipo de tabla definida por el usuario en su base de datos:

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

Luego, debe crear una tabla de datos en su código c#:

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

Luego cambie su procedimiento almacenado para aceptar este tipo de datos 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

Luego, debe convertir la matriz de cadenas en una tabla de datos en su código c#.

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

Agregue DataTable como parámetro al procedimiento almacenado:

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

Construir y ejecutar.

Este enfoque debería tener un mejor rendimiento que usar una función definida por el usuario de sql, y también se puede usar para diferentes tipos de datos. esta es una de las mejores razones para usarlo:Considere un escenario en el que necesita pasar una serie de fechas:el enfoque csv requiere que sql convierta cada cadena en una fecha, mientras que con este enfoque simplemente puede pasar las fechas tal cual, sin convertirlos en cadenas y luego volver a fechas. Además, puede pasar matrices o diccionarios de 2 dimensiones, todo lo que tiene que hacer es crear el tipo de datos definido por el usuario apropiado en su base de datos sql.

Nota:código escrito directamente aquí, puede haber algunos errores tipográficos.