sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan overføres strengmatrix i SQL-parameter til IN-klausul i SQL

Introduktion :Selvom OP allerede har accepteret et svar, tænkte jeg, at det ville være bedre at dele min erfaring, fordi jeg mener, at den tilgang, jeg er ved at vise, er bedre end den, der accepteres.

Jeg finder ud af, at den bedste måde at overføre arrays til sql-serverdatabasen er at bruge en user defined table type og c# DataTable .I dit tilfælde er det ret nemt, da du vil videregive en strengmatrix af én dimension:

Først skal du oprette en brugerdefineret tabeltype i din database:

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

Så skal du oprette en datatabel i din c# kode:

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

Skift derefter din lagrede procedure for at acceptere denne datatype 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

Så skal du konvertere string-arrayet til en dataTable i din c#-kode.

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

Tilføj DataTable som en parameter til den lagrede procedure:

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

Byg og kør.

Denne tilgang skulle have bedre ydeevne end at bruge en sql brugerdefineret funktion og kan også bruges til forskellige datatyper. dette er en af ​​de bedste grunde til at bruge det:Overvej et scenarie, hvor du skal sende en række datoer:csv-tilgangen kræver sql for at konvertere hver streng til en dato, mens du med denne tilgang blot kan overføre datoerne, som de er, uden at konvertere dem til strenge og derefter tilbage til datoer. Du kan også sende et array med 2 dimensioner eller ordbøger, alt hvad du skal gøre er at oprette den passende brugerdefinerede datatype i din sql-database.

Bemærk:kode skrevet direkte her, der kan være nogle tastefejl.



  1. Hvordan kan jeg opdatere et felt af min spinner med brugerinput i EditText

  2. Ugyldig identifikator SQL

  3. Online migrering fra MySQL 5.6 Non-GTID til MySQL 5.7 med GTID

  4. JSON_OBJECTAGG() Funktion i Oracle