sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man skickar strängarray i SQL-parameter till IN-sats i SQL

Introduktion :Även om OP redan accepterat ett svar, tänkte jag att det vore bättre att dela med mig av mina erfarenheter, eftersom jag tror att det tillvägagångssätt jag ska visa är bättre än det som accepteras.

Jag tycker att det bästa sättet att skicka Arrays till SQL Server-databasen är att använda en user defined table type och c# DataTable .I ditt fall, eftersom du vill skicka en strängarray av en dimension, är det ganska enkelt:

Först måste du skapa en användardefinierad tabelltyp i din databas:

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

Sedan måste du skapa en datatabell i din c#-kod:

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

Ändra sedan din lagrade procedur för att acceptera denna datatyp som en parameter:

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

Sedan måste du konvertera strängarrayen till en datatabell i din c#-kod.

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

Lägg till DataTable som en parameter till den lagrade proceduren:

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

Bygg och kör.

Detta tillvägagångssätt bör ha bättre prestanda än att använda en sql användardefinierad funktion, och kan även användas för olika datatyper. det här är en av de bästa anledningarna till att använda det:Tänk på ett scenario där du behöver skicka en array av datum:csv-metoden kräver att sql konverterar varje sträng till ett datum, medan du med det här tillvägagångssättet helt enkelt kan skicka datumen som de är, utan att konvertera dem till strängar och sedan tillbaka till datum. Du kan också skicka array med två dimensioner eller ordlistor, allt du behöver göra är att skapa lämplig användardefinierad datatyp i din sql-databas.

Obs! koden skrivs direkt här, det kan finnas några stavfel.



  1. Databassäkerhet 101:Säkerhet i databaser med öppen källkod

  2. Hur man visar alla Oracle Database-privilegier för en användare

  3. Hur man vänder ordningen på tecken i en sträng i MySQL

  4. Starta och fylla i en Postgres-behållare i Docker