Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara meneruskan array string dalam parameter SQL ke klausa IN dalam SQL

Pengantar :Meskipun OP sudah menerima jawaban, saya pikir akan lebih baik untuk membagikan pengalaman saya, karena saya percaya pendekatan yang akan saya tunjukkan lebih baik daripada yang diterima.

Saya menemukan bahwa cara terbaik untuk meneruskan Array ke database server sql adalah menggunakan user defined table type dan c# DataTable .Dalam kasus Anda, karena Anda ingin melewatkan larik string satu dimensi, caranya cukup mudah:

Pertama, Anda perlu membuat tipe tabel yang ditentukan pengguna di database Anda:

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

Kemudian Anda perlu membuat datatable dalam kode c# Anda:

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

Kemudian ubah prosedur tersimpan Anda untuk menerima tipe data ini sebagai 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

Maka Anda perlu mengonversi array string menjadi dataTable dalam kode c# Anda.

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

Tambahkan DataTable sebagai parameter ke prosedur tersimpan:

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

Bangun dan jalankan.

Pendekatan ini harus memiliki kinerja yang lebih baik daripada menggunakan fungsi yang ditentukan pengguna sql, dan juga dapat digunakan untuk tipe data yang berbeda. ini adalah salah satu alasan terbaik untuk menggunakannya:Pertimbangkan skenario di mana Anda harus melewatkan larik Tanggal:pendekatan csv memerlukan sql untuk mengonversi setiap string menjadi tanggal, sementara dengan pendekatan ini Anda cukup meneruskan tanggal apa adanya, tanpa mengubahnya menjadi string dan kemudian kembali ke tanggal. Selain itu, Anda dapat melewatkan larik atau kamus 2 dimensi, yang harus Anda lakukan adalah membuat tipe data yang ditentukan pengguna yang sesuai di database sql Anda.

Catatan:kode ditulis langsung di sini, mungkin ada beberapa kesalahan ketik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql server 2008 management studio tidak memeriksa sintaks kueri saya

  2. Memperkenalkan Fitur Baru:Always On Availability Group

  3. Pilih dan Edit Blok Vertikal di SQL Server Management Studio ( SSMS) - Tutorial SQL Server / TSQL Bagian 9

  4. Bagaimana cara memeriksa apakah ada database di SQL Server?

  5. Pemicu untuk mencegah Penyisipan untuk data duplikat dari dua kolom