Bagaimana cara melewatkan array ke prosedur tersimpan SQL Server?
Misalnya, saya punya daftar karyawan. Saya ingin menggunakan daftar ini sebagai tabel dan bergabung dengan tabel lain. Tetapi daftar karyawan harus diberikan sebagai parameter dari C #.
c#
sql-server
tsql
stored-procedures
Sergey
sumber
sumber
Jawaban:
SQL Server 2008 (atau lebih baru)
Pertama, di database Anda, buat dua objek berikut:
Sekarang dalam kode C # Anda:
SQL Server 2005
Jika Anda menggunakan SQL Server 2005, saya masih akan merekomendasikan fungsi split atas XML. Pertama, buat fungsi:
Sekarang prosedur tersimpan Anda bisa saja:
Dan dalam kode C # Anda, Anda hanya harus melewati daftar sebagai
'1,2,3,12'
...Saya menemukan metode melewati tabel nilai parameter menyederhanakan rawatan dari solusi yang menggunakannya dan sering memiliki peningkatan kinerja dibandingkan dengan implementasi lain termasuk XML dan pemisah string.
Input didefinisikan dengan jelas (tidak ada yang harus menebak jika pembatas adalah koma atau semi-kolon) dan kami tidak memiliki ketergantungan pada fungsi pemrosesan lain yang tidak jelas tanpa memeriksa kode untuk prosedur yang tersimpan.
Dibandingkan dengan solusi yang melibatkan skema XML yang ditentukan pengguna dan bukan UDT, ini melibatkan sejumlah langkah yang sama tetapi dalam pengalaman saya adalah kode yang jauh lebih sederhana untuk mengelola, memelihara, dan membaca.
sumber
SELECT [colA] FROM [MyTable] WHERE [Id] IN (SELECT [Id] FROM @ListOfIds)
.Berdasarkan pengalaman saya, dengan membuat ekspresi terbatas dari ID karyawan, ada solusi yang rumit dan bagus untuk masalah ini. Anda hanya harus membuat ekspresi string seperti
';123;434;365;'
di dalamnya123
,434
dan365
sebagian adalah ID karyawan. Dengan memanggil prosedur di bawah ini dan menyampaikan ungkapan ini kepadanya, Anda dapat mengambil catatan yang Anda inginkan. Dengan mudah Anda dapat bergabung dengan "tabel lain" ke dalam kueri ini. Solusi ini cocok di semua versi SQL server. Juga, dibandingkan dengan menggunakan variabel tabel atau tabel temp, ini adalah solusi yang sangat cepat dan dioptimalkan.sumber
Gunakan parameter bernilai tabel untuk prosedur tersimpan Anda.
Ketika Anda meneruskannya dari C # Anda akan menambahkan parameter dengan tipe data SqlDb. Terstruktur.
Lihat disini: http://msdn.microsoft.com/en-us/library/bb675163.aspx
Contoh:
sumber
Anda harus meneruskannya sebagai parameter XML.
Sunting: kode cepat dari proyek saya untuk memberi Anda ide:
Kemudian Anda bisa menggunakan tabel temp untuk bergabung dengan tabel Anda. Kami mendefinisikan arrayOfUlong sebagai skema XML bawaan untuk menjaga integritas data, tetapi Anda tidak harus melakukannya. Saya akan merekomendasikan menggunakannya jadi di sini adalah kode cepat untuk memastikan Anda selalu mendapatkan XML dengan panjang.
sumber
Konteks selalu penting, seperti ukuran dan kompleksitas array. Untuk daftar kecil hingga menengah, beberapa jawaban yang diposting di sini baik-baik saja, meskipun beberapa klarifikasi harus dibuat:
text()
Fungsi XML Untuk info lebih lanjut (yaitu analisis kinerja) tentang penggunaan XML untuk membagi daftar, periksa "Menggunakan XML untuk meneruskan daftar sebagai parameter dalam SQL Server" oleh Phil Factor.DataTable
cara menggandakan data dalam memori karena disalin dari koleksi asli. Oleh karena itu menggunakanDataTable
metode melintas di TVP tidak bekerja dengan baik untuk set data yang lebih besar (yaitu tidak skala dengan baik).DataTable
metode TVP, XML tidak skala dengan baik karena lebih dari dua kali lipat data dalam memori karena perlu juga memperhitungkan overhead dokumen XML.Dengan semua yang dikatakan, JIKA data yang Anda gunakan besar atau tidak terlalu besar tetapi tumbuh secara konsisten, maka
IEnumerable
metode TVP adalah pilihan terbaik karena mengalirkan data ke SQL Server (sepertiDataTable
metode), TAPI tidak membutuhkan duplikasi koleksi dalam memori (tidak seperti metode lainnya). Saya memposting contoh kode SQL dan C # dalam jawaban ini:Lewati Kamus ke Prosedur Tersimpan T-SQL
sumber
Tidak ada dukungan untuk array di server sql tetapi ada beberapa cara yang Anda dapat melewati koleksi ke proc yang disimpan.
Tautan di bawah ini dapat membantu Anda
meneruskan koleksi ke prosedur tersimpan
sumber
Saya telah mencari-cari semua contoh dan jawaban tentang cara meneruskan array apa pun ke server sql tanpa kesulitan membuat tipe Tabel baru, sampai saya menemukan linK ini , di bawah ini adalah bagaimana saya menerapkannya pada proyek saya:
--Kode berikut akan mendapatkan Array sebagai Parameter dan memasukkan nilai-nilai itu --array ke tabel lain
Berharap kamu menikmatinya
sumber
@s
adalah CSV maka akan lebih cepat untuk hanya membagi itu (yaitu INSERT INTO ... SELECT FROM SplitFunction). Konversi ke XML lebih lambat dari CLR, dan XML berbasis atribut jauh lebih cepat. Dan ini adalah daftar sederhana namun lewat XML atau TVP juga dapat menangani array yang kompleks. Tidak yakin apa yang didapat dengan menghindari yang sederhana, satu kaliCREATE TYPE ... AS TABLE
.Ini akan membantu Anda. :) Ikuti langkah selanjutnya,
Copy Paste kode berikut apa adanya, itu akan membuat Function yang mengubah String menjadi Int
Buat prosedur tersimpan berikut
Jalankan SP ini Menggunakan
exec sp_DeleteId '1,2,3,12'
ini adalah string Id yang ingin Anda hapus,Anda mengonversi array menjadi string dalam C # dan meneruskannya sebagai parameter Prosedur Tersimpan
Ini akan menghapus beberapa baris, Semua yang terbaik
sumber
Butuh waktu lama untuk memikirkan ini, jadi kalau-kalau ada yang membutuhkannya ...
Ini didasarkan pada metode SQL 2005 dalam jawaban Aaron, dan menggunakan fungsi SplitInts-nya (saya baru saja menghapus parameter delim karena saya akan selalu menggunakan koma). Saya menggunakan SQL 2008 tetapi saya menginginkan sesuatu yang berfungsi dengan dataset yang diketik (XSD, TableAdapters) dan saya tahu string params bekerja dengan itu.
Saya mencoba menjalankan fungsinya dalam klausa ketik "where in (1,2,3)", dan tidak beruntung dengan cara langsung. Jadi saya membuat tabel temp terlebih dahulu, dan kemudian melakukan inner join bukannya "where in". Berikut ini adalah contoh penggunaan saya, dalam kasus saya saya ingin mendapatkan daftar resep yang tidak mengandung bahan-bahan tertentu:
sumber
Seperti yang orang lain catat di atas, salah satu cara untuk melakukan ini adalah dengan mengubah array Anda menjadi string dan kemudian membagi string di dalam SQL Server.
Pada SQL Server 2016, ada cara bawaan untuk memisahkan string yang disebut
Ini mengembalikan satu set baris yang bisa Anda masukkan ke tabel temp (atau tabel sebenarnya) Anda.
akan menghasilkan:
Jika Anda ingin menjadi pelamun:
akan memberi Anda hasil yang sama seperti di atas (kecuali nama kolom adalah "thenumber"), tetapi diurutkan. Anda bisa menggunakan variabel tabel seperti tabel lainnya, sehingga Anda dapat dengan mudah bergabung dengan tabel lain di DB jika Anda mau.
Perhatikan bahwa penginstalan SQL Server Anda harus pada tingkat kompatibilitas 130 atau lebih tinggi agar
STRING_SPLIT()
fungsi dapat dikenali. Anda dapat memeriksa tingkat kompatibilitas Anda dengan pertanyaan berikut:Sebagian besar bahasa (termasuk C #) memiliki fungsi "bergabung" yang dapat Anda gunakan untuk membuat string dari array.
Kemudian Anda meneruskan
sqlparam
sebagai parameter Anda ke prosedur tersimpan di atas.sumber
sumber