Klausa SQL IN berparameter menggunakan parameter dinamik
Parameterisasi adalah penting untuk meningkatkan prestasi dan keselamatan apabila memproses pertanyaan SQL yang menggunakan klausa IN yang mengandungi bilangan parameter yang berubah-ubah. Artikel ini menumpukan pada cara untuk meparameterkan pertanyaan sedemikian dengan berkesan, mengelakkan penggunaan prosedur tersimpan atau teknologi XML.
Parameter pengisian dinamik
Kaedah yang dibincangkan dalam artikel ini melibatkan mencipta klausa IN dinamik menggunakan nilai parameter. Contohnya, contoh pertanyaan yang disediakan dalam soalan:
<code class="language-sql">SELECT * FROM Tags WHERE Name IN ('ruby','rails','scruffy','rubyonrails') ORDER BY Count DESC</code>
boleh diparameterkan sebagai:
<code class="language-csharp">string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" }; string cmdText = "SELECT * FROM Tags WHERE Name IN ({0})"; string[] paramNames = tags.Select((s, i) => "@tag" + i.ToString()).ToArray(); string inClause = string.Join(", ", paramNames); using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) { for (int i = 0; i < tags.Length; i++) { cmd.Parameters.AddWithValue(paramNames[i], tags[i]); } // ... 执行查询 ... }</code>
Teknik ini menjana pertanyaan dengan nilai parameter:
<code class="language-sql">SELECT * FROM Tags WHERE Name IN (@tag0, @tag1, @tag2, @tag3)</code>
Kemudian kod akan menetapkan nilai parameter masing-masing untuk @tag0
, @tag1
, @tag2
, @tag3
.
Langkah Berjaga-jaga Keselamatan
Perlu ditegaskan bahawa kaedah parameterisasi ini tidak terdedah kepada serangan suntikan SQL kerana nilai yang dibekalkan pengguna tidak dibenamkan secara langsung dalam CommandText. Sebaliknya, ia disuntik ke dalam pertanyaan sebagai parameter, memastikan bahawa pernyataan SQL yang berniat jahat tidak dapat dilaksanakan.
Pelan pertanyaan cache dan parameter dinamik
Walaupun parameterisasi dinamik memberikan faedah keselamatan, ia mungkin memberi kesan kepada keberkesanan pelan pertanyaan cache. Ini disebabkan oleh perubahan dalam bilangan parameter, yang memerlukan pelan pertanyaan baharu dibuat untuk setiap gabungan unik. Walau bagaimanapun, dalam kes di mana pertanyaan agak mudah dan bilangan parameter adalah terhad, kesan prestasi mungkin boleh diabaikan.
Untuk pertanyaan atau situasi yang lebih kompleks dengan sejumlah besar kemungkinan parameter, anda mungkin ingin mempertimbangkan kaedah lain yang membenarkan penggunaan pelan pertanyaan cache.
Atas ialah kandungan terperinci Bagaimana untuk memarameterkan SQL dalam klausa dengan argumen dinamik dengan selamat dan cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!