Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да предадете низов масив в SQL параметър към IN клауза в SQL

Въведение :Въпреки че ОП вече прие отговор, реших, че би било по-добре да споделя опита си, защото вярвам, че подходът, който ще покажа, е по-добър от приетия.

Намирам, че най-добрият начин за предаване на масиви към sql сървърна база данни е използването на user defined table type и c# DataTable .В твоя случай, тъй като искате да предадете масив от низове с едно измерение, това е доста лесно:

Първо трябва да създадете потребителски дефиниран тип таблица във вашата база данни:

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

След това трябва да създадете таблица с данни във вашия C# код:

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

След това променете вашата съхранена процедура, за да приемете този тип данни като параметър:

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

След това трябва да конвертирате низовия масив в dataTable във вашия C# код.

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

Добавете DataTable като параметър към съхранената процедура:

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

Създайте и стартирайте.

Този подход трябва да има по-добра производителност от използването на sql дефинирана от потребителя функция и също така може да се използва за различни типове данни. това е една от най-добрите причини да го използвате:Помислете за сценарий, при който трябва да предадете масив от дати:подходът csv изисква sql да преобразува всеки низ в дата, докато с този подход можете просто да предадете датите както са, без да ги конвертирате в низове и след това обратно към дати. Освен това можете да предадете масив с 2 измерения или речници, всичко, което трябва да направите, е да създадете подходящия тип данни, дефиниран от потребителя във вашата sql база данни.

Забележка:кодът е написан директно тук, може да има печатни грешки.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция COALESCE в TSQL

  2. Край на поддръжката за SQL Server 2008 &2008 R2

  3. Как да видите регистрационните файлове на транзакциите в SQL Server 2008

  4. Как да използвате дизайнера на заявки в SQL Server

  5. Лоша идея ли е да имаш „ИЛИ“ в състояние INNER JOIN?