sql >> Databáze >  >> RDS >> Sqlserver

Jak předat pole řetězců v parametru SQL do klauzule IN v SQL

Úvod :Přestože OP již přijal odpověď, myslel jsem si, že by bylo lepší podělit se o své zkušenosti, protože věřím, že přístup, který se chystám ukázat, je lepší než ten, který byl přijat.

Zjistil jsem, že nejlepší způsob, jak předat pole do databáze serveru SQL, je pomocí user defined table type a c# DataTable .Ve vašem případě, protože chcete předat pole řetězců jedné dimenze, je to docela snadné:

Nejprve musíte vytvořit uživatelsky definovaný typ tabulky ve vaší databázi:

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

Poté musíte ve svém kódu c# vytvořit datovou tabulku:

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

Poté změňte uloženou proceduru tak, aby akceptovala tento datový typ jako parametr:

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

Poté musíte převést pole řetězců na dataTable ve vašem kódu c#.

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

Přidejte DataTable jako parametr do uložené procedury:

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

Sestavit a spustit.

Tento přístup by měl mít lepší výkon než použití uživatelsky definované funkce SQL a také může být použit pro různé typy dat. toto je jeden z nejlepších důvodů, proč jej použít:Zvažte scénář, kdy potřebujete předat pole dat:přístup csv vyžaduje sql k převodu každého řetězce na datum, zatímco s tímto přístupem můžete data jednoduše předat tak, jak jsou, bez jejich převodu na řetězce a poté zpět na data. Také můžete předat pole 2 dimenzí nebo slovníky, vše, co musíte udělat, je vytvořit příslušný uživatelsky definovaný datový typ ve vaší databázi SQL.

Poznámka:Kód napsaný přímo zde může být překlepy.



  1. Hledání duplicitních hodnot v MySQL

  2. Jak se připojit k více sloupcům

  3. Jak vypočítat věk v MariaDB

  4. Přetypování datového typu Postgres