Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So übergeben Sie ein String-Array im SQL-Parameter an die IN-Klausel in SQL

Einführung :Obwohl das OP bereits eine Antwort akzeptiert hat, dachte ich, es wäre besser, meine Erfahrungen zu teilen, weil ich glaube, dass der Ansatz, den ich gleich zeigen werde, besser ist als der akzeptierte.

Ich finde, dass der beste Weg, Arrays an die SQL-Server-Datenbank zu übergeben, die Verwendung eines user defined table type ist und c# DataTable .In Ihrem Fall, da Sie ein String-Array mit einer Dimension übergeben möchten, ist es ziemlich einfach:

Zuerst müssen Sie einen benutzerdefinierten Tabellentyp in Ihrer Datenbank erstellen:

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

Dann müssen Sie eine Datentabelle in Ihrem C#-Code erstellen:

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

Ändern Sie dann Ihre gespeicherte Prozedur so, dass sie diesen Datentyp als Parameter akzeptiert:

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

Dann müssen Sie das String-Array in Ihrem c#-Code in eine dataTable umwandeln.

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

Fügen Sie der gespeicherten Prozedur die DataTable als Parameter hinzu:

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

Erstellen und ausführen.

Dieser Ansatz sollte eine bessere Leistung aufweisen als die Verwendung einer benutzerdefinierten SQL-Funktion und kann auch für verschiedene Datentypen verwendet werden. Dies ist einer der besten Gründe, es zu verwenden:Stellen Sie sich ein Szenario vor, in dem Sie ein Array von Datumsangaben übergeben müssen:Der CSV-Ansatz erfordert, dass SQL jede Zeichenfolge in ein Datum umwandelt, während Sie bei diesem Ansatz die Daten einfach unverändert übergeben können. ohne sie in Zeichenfolgen und dann zurück in Daten umzuwandeln. Sie können auch zweidimensionale Arrays oder Wörterbücher übergeben, alles, was Sie tun müssen, ist, den entsprechenden benutzerdefinierten Datentyp in Ihrer SQL-Datenbank zu erstellen.

Hinweis:Der Code wurde direkt hier geschrieben, es können einige Tippfehler enthalten sein.