Saya memiliki kode berikut:
Using cmd As SqlCommand = Connection.CreateCommand
cmd.CommandText = "UPDATE someTable SET Value = @Value"
cmd.CommandText &= " WHERE Id = @Id"
cmd.Parameters.AddWithValue("@Id", 1234)
cmd.Parameters.AddWithValue("@Value", "myValue")
cmd.ExecuteNonQuery
End Using
Saya ingin tahu apakah ada cara untuk mendapatkan statemen SQL final sebagai sebuah String, yang akan terlihat seperti ini:
UPDATE someTable SET Value = "myValue" WHERE Id = 1234
Jika ada yang bertanya-tanya mengapa saya melakukan ini:
- untuk mencatat (gagal) pernyataan
- karena memiliki kemungkinan untuk menyalin & menempelkannya ke Enterprise Manager untuk tujuan pengujian
Jawaban:
Meskipun tidak sempurna, ini adalah sesuatu yang saya dapatkan untuk TSQL - bisa dengan mudah diubah untuk rasa lain ... Jika tidak ada yang lain, itu akan memberi Anda titik awal untuk perbaikan Anda sendiri :)
Ini melakukan pekerjaan OK pada tipe data dan parameter output dll mirip dengan menggunakan "jalankan prosedur tersimpan" di SSMS. Kami kebanyakan menggunakan SPs sehingga perintah "teks" tidak memperhitungkan parameter dll
ini menghasilkan output di sepanjang garis ini ...
sumber
ToBooleanOrDefault
sini: Pertanyaan # 3244850Untuk tujuan logging, saya khawatir tidak ada cara yang lebih baik untuk melakukan ini selain membuat sendiri string:
sumber
query = Regex.Replace(query, @"\b" + p.ParameterName + @"\b", p.Value.ToString());
untuk mengganti params dalam string. Ini akan menggantikan 'seluruh kata'. Ini mungkin bukan solusi universal meskipun sebagai \ b menandai posisi antara karakter kata dan karakter non-kata jadi jika nama parameter Anda mulai dengan @, Anda harus menggunakanp.ParameterName + @"\b"
untuk mengganti param dalam string kueri.Anda tidak bisa, karena tidak menghasilkan SQL apa pun.
Permintaan parameterisasi (yang masuk
CommandText
) dikirim ke SQL Server sebagai setara dengan pernyataan yang disiapkan. Saat Anda menjalankan perintah, parameter dan teks kueri diperlakukan secara terpisah. Pada titik waktu string SQL lengkap dihasilkan.Anda dapat menggunakan SQL Profiler untuk melihat di belakang layar.
sumber
Saya membutuhkan perintah serupa dengan transformator string untuk memungkinkan lebih banyak logging verbose, jadi saya menulis ini. Ini akan menghasilkan teks yang diperlukan untuk menjalankan kembali perintah dalam sesi baru termasuk parameter output dan parameter terstruktur. Ini diuji ringan, tetapi peringatan emptor.
Contoh:
Akan menghasilkan:
Penerapan:
sumber
N
awalan.Saya juga memiliki masalah ini di mana beberapa pertanyaan parameter atau sp akan memberi saya SqlException (sebagian besar string atau data biner akan terpotong), dan pernyataan di mana sulit untuk debug (Sejauh yang saya tahu saat ini tidak ada dukungan sql-profiler untuk SQL Azure)
Saya melihat banyak kode simular dalam reaksi di sini. Saya akhirnya menempatkan solusi saya dalam proyek Sql-Library untuk digunakan di masa depan.
Generator tersedia di sini: https://github.com/jeroenpot/SqlHelper/blob/master/Source/Mirabeau.MsSql.Library/SqlGenerator.cs
Ini mendukung CommandType.Text dan CommandType.StoredProcedure
Dan jika Anda menginstal paket nuget, Anda dapat membuatnya dengan pernyataan ini:
sumber
Jika Anda menggunakan SQL Server, Anda bisa menggunakan SQL Server Profiler (jika Anda memilikinya) untuk melihat string perintah yang sebenarnya dieksekusi. Itu akan berguna untuk tujuan pengujian salin / rekat tetapi tidak untuk pencatatan, saya khawatir.
sumber
Jawaban terlambat, saya tahu tetapi saya juga menginginkan ini sehingga saya bisa mencatat SQL. Berikut ini singkat dan memenuhi kebutuhan saya.
Berikut ini menghasilkan SQL Anda dapat menyalin / menempel di SSMS (ini mengganti parameter dengan nilai-nilai dengan benar). Anda dapat menambahkan lebih banyak jenis tetapi ini memenuhi semua yang saya gunakan dalam kasus ini.
Sekarang saya dapat mencatat SQL sebelum saya menjalankannya:
sumber
Profiler adalah pilihan terbaik Anda.
Anda mungkin perlu menyalin seperangkat pernyataan dari profiler karena langkah persiapan + eksekusi yang terlibat.
sumber
Saya memiliki pertanyaan yang persis sama dan setelah membaca tanggapan ini secara keliru memutuskan bahwa tidak mungkin untuk mendapatkan permintaan yang tepat. Saya salah.
Solusi: Buka
Activity Monitor
diSQL Server Management Studio
, mempersempit bagian proses untuk username login, database atau nama aplikasi yang aplikasi Anda menggunakan di connection string. Ketika panggilan dibuat untuk menyegarkan dbActivity Monitor
. Ketika Anda melihat prosesnya, klik kanan padanya danView Details
.Catatan, ini mungkin bukan opsi yang layak untuk db yang sibuk. Tetapi Anda harus dapat mempersempit hasilnya dengan menggunakan langkah-langkah ini.
sumber
Digunakan bagian dari kode Flapper untuk solusi saya, yang mengembalikan seluruh string SQL termasuk nilai parameter untuk dijalankan di MS SQL SMS.
sumber
Solusi Saya:
sumber
Saya menulis metode ini untuk saya. Saya menggunakan beberapa bagian dari kode Bruno Ratnieks . Mungkin bermanfaat bagi seseorang.
sumber
Jika hanya untuk memeriksa bagaimana parameter diformat dalam kueri hasil, sebagian besar DBMS akan mengizinkan kueri literal dari nol. Jadi:
Dengan begitu Anda dapat melihat apakah penawaran dilipatgandakan, dll.
sumber
Ini yang saya gunakan untuk menampilkan daftar parameter untuk prosedur tersimpan ke konsol debug:
Ini akan menghasilkan keluaran konsol yang mirip dengan ini:
Saya menempatkan kode ini langsung di bawah prosedur yang ingin saya debug dan mirip dengan sesi profiler sql tetapi dalam C #.
sumber
Versi modifikasi dari jawaban Kon karena hanya berfungsi sebagian dengan parameter bernama serupa. Sisi bawah menggunakan fungsi String Replace. Selain itu, saya memberinya kredit penuh untuk solusinya.
sumber
Solusi ini bekerja untuk saya saat ini. Mungkin bermanfaat bagi seseorang. Maafkan semua redundansi.
sumber
Seperti @pkExec dan @Alok sebutkan, gunakan Ganti tidak berfungsi dalam 100% kasus. Ini adalah solusi yang saya gunakan di DAL kami yang menggunakan RegExp untuk "mencocokkan seluruh kata" saja dan memformat tipe data dengan benar. Dengan demikian SQL yang dihasilkan dapat diuji secara langsung di MySQL Workbench (atau SQLSMS, dll ...) :)
(Ganti fungsi MySQLHelper.EscapeString () sesuai dengan DBMS yang digunakan.)
Contoh:
Akan dihasilkan:
sumber
kueri perintah sql akan dieksekusi dengan exec sp_executesql, jadi inilah cara lain untuk mendapatkan pernyataan sebagai string (metode ekstensi SqlCommand):
sumber
diperlukan untuk mencakup prosedur yang tidak tersimpan juga jadi saya menambah pustaka CommandAsSql (lihat komentar di bawah jawaban @ Flapper di atas) dengan logika ini:
permintaan tarik ada di: https://github.com/jphellemons/CommandAsSql/pull/3/commits/527d696dc6055c5bcf858b9700b83dc863f04896
ide Regex didasarkan pada komentar @ stambikk dan EvZ di atas dan bagian "Pembaruan:" dari https://stackoverflow.com/a/2544661/903783 yang menyebutkan "pernyataan negatif melihat ke belakang". Penggunaan \ B sebagai ganti \ b untuk deteksi batas kata di awal ekspresi reguler adalah karena p.parameterName akan selalu dimulai dengan "@" yang bukan karakter kata.
perhatikan bahwa ParameterValueForSQL () adalah metode ekstensi yang didefinisikan di perpustakaan CommandAsSql untuk menangani masalah seperti nilai parameter string kutip tunggal dll.
sumber
Jika Anda akan mengkonversi commandtext:
Sekarang Anda bisa mendapatkan commandtext non parameter sebagai berikut:
dan hasilnya adalah "UPDATE someTable SET Value = 'myValue' WHERE Id = 1234" tanpa parameter lagi
sumber
Kode Extended Kon untuk membantu men-debug prosedur yang tersimpan:
Dalam uji kasus pertama saya, ini menghasilkan:
Anda mungkin perlu menambahkan beberapa tugas tipe "..is ..." yang lebih bersyarat, misalnya untuk tanggal dan waktu.
sumber
Satu liner:
sumber
Dari perintah parameter ke perintah non-parameter, Anda dapat mengubah yang ini
Untuk
sumber