Saya memanggil prosedur tersimpan SQL Server dari kode C # saya:
using (SqlConnection conn = new SqlConnection(connstring))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("InsertQuerySPROC", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
var STableParameter = cmd.Parameters.AddWithValue("@QueryTable", QueryTable);
var NDistanceParameter = cmd.Parameters.AddWithValue("@NDistanceThreshold", NDistanceThreshold);
var RDistanceParameter = cmd.Parameters.AddWithValue(@"RDistanceThreshold", RDistanceThreshold);
STableParameter .SqlDbType = SqlDbType.Structured;
NDistanceParameter.SqlDbType = SqlDbType.Int;
RDistanceParameter.SqlDbType = SqlDbType.Int;
// Execute the query
SqlDataReader QueryReader = cmd.ExecuteReader();
Proc yang saya simpan cukup standar tetapi bergabung dengan QueryTable
(karena itu kebutuhan untuk menggunakan proc yang disimpan).
Sekarang: Saya ingin menambahkan daftar string List<string>
,, ke set parameter. Misalnya, kueri proc saya yang tersimpan berjalan seperti ini:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
Namun, daftar stringnya dinamis dan panjangnya beberapa ratus.
Apakah ada cara untuk meneruskan daftar string List<string>
ke proc yang disimpan ??? Atau apakah ada cara yang lebih baik untuk melakukan ini?
Terima kasih banyak, Brett
c#
sql
stored-procedures
Brett
sumber
sumber
using
blok.Jawaban:
Jika Anda menggunakan SQL Server 2008, ada fitur baru yang disebut Jenis Tabel Buatan Pengguna. Berikut ini contoh cara menggunakannya:
Buat Jenis Tabel Buatan Pengguna Anda:
Selanjutnya Anda perlu menggunakannya dengan benar dalam prosedur tersimpan Anda:
Akhirnya inilah beberapa sql untuk menggunakannya di c #:
Untuk menjalankan ini dari SSMS
sumber
Pola tipikal dalam situasi ini adalah meneruskan elemen dalam daftar dipisahkan koma, dan kemudian dalam SQL membaginya menjadi tabel yang dapat Anda gunakan. Kebanyakan orang biasanya membuat fungsi khusus untuk melakukan ini seperti:
Dan kemudian Anda dapat menggunakannya di kueri lain.
sumber
Tidak, array / daftar tidak dapat diteruskan ke SQL Server secara langsung.
Pilihan berikut tersedia:
sumber
Ya, buat parameter proc Tersimpan sebagai
VARCHAR(...)
Dan kemudian berikan nilai yang dipisahkan koma ke prosedur tersimpan.Jika Anda menggunakan Sql Server 2008 Anda dapat memanfaatkan TVP ( Parameter Nilai Tabel ): SQL 2008 TVP dan LINQ jika struktur QueryTable lebih kompleks daripada larik string jika tidak maka akan berlebihan karena memerlukan jenis tabel yang akan dibuat dalam SQl Server
sumber
Buatlah sebuah datatable dengan satu kolom daripada List dan tambahkan string ke tabel. Anda dapat meneruskan datatable ini sebagai tipe terstruktur dan melakukan join lain dengan kolom judul pada tabel Anda.
sumber
Jika Anda lebih suka memisahkan daftar CSV di SQL, ada cara lain untuk melakukannya menggunakan Common Table Expressions (CTE). Lihat Cara efisien untuk memisahkan string menggunakan CTE .
sumber
Satu-satunya cara yang saya ketahui adalah membuat daftar CSV dan meneruskannya sebagai string. Kemudian, di sisi SP, pisahkan dan lakukan apa pun yang Anda butuhkan.
sumber
buat TYPE sebagai tabel dan beri nama sebagai "StringList1"
Buat prosedur seperti di atas dan beri nama sebagai "UserStringList1"
di c #, Coba ini
sumber