sql >> Database >  >> RDS >> Sqlserver

Hoe tekenreeksarray in SQL-parameter door te geven aan IN-clausule in SQL

Inleiding :Hoewel de OP al een antwoord had geaccepteerd, dacht ik dat het beter zou zijn om mijn ervaring te delen, omdat ik geloof dat de aanpak die ik ga laten zien beter is dan de geaccepteerde.

Ik vind dat de beste manier om arrays door te geven aan de sql-serverdatabase is door een user defined table type te gebruiken en c# DataTable .In jouw geval, aangezien je een string-array van één dimensie wilt doorgeven, is het vrij eenvoudig:

Eerst moet u een door de gebruiker gedefinieerd tabeltype in uw database maken:

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

Dan moet je een datatabel maken in je c#-code:

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

Wijzig vervolgens uw opgeslagen procedure om dit gegevenstype als parameter te accepteren:

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

Vervolgens moet u de tekenreeksarray converteren naar een dataTable in uw c#-code.

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

Voeg de DataTable toe als parameter aan de opgeslagen procedure:

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

Bouwen en uitvoeren.

Deze benadering zou betere prestaties moeten hebben dan het gebruik van een door de gebruiker gedefinieerde sql-functie, en kan ook voor verschillende gegevenstypen worden gebruikt. dit is een van de beste redenen om het te gebruiken:denk aan een scenario waarin u een reeks datums moet doorgeven:de csv-benadering vereist dat sql elke tekenreeks naar een datum converteert, terwijl u met deze benadering de datums gewoon kunt doorgeven zoals ze zijn, zonder ze naar strings en vervolgens terug naar datums te converteren. U kunt ook arrays of woordenboeken met 2 dimensies doorgeven, het enige dat u hoeft te doen is het juiste door de gebruiker gedefinieerde gegevenstype in uw sql-database te maken.

Opmerking:de code is hier rechtstreeks geschreven, er kunnen enkele typefouten zijn.



  1. FlySpeed ​​SQL-query verbinden met Salesforce.com

  2. Laravel:Opgegeven sleutel was te lang; maximale sleutellengte is 767 bytes

  3. Hoe u alle mogelijke combinaties van rijen uit twee tabellen in SQL kunt krijgen

  4. Haal de ID van een object uit de naam in SQL Server:OBJECT_ID()