เหตุผลที่คำสั่ง SQL ถูกห่อด้วยsp_executesql
คือการตั้งค่าของSqlCommand.Commandtype
คุณสมบัติและส่งพารามิเตอร์ใด ๆ ไปยังคำสั่ง
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
รหัสด้านบนลงท้ายด้วย T-SQL นี้:
exec proc1 @param1=1
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
รหัสนี้ลงท้ายด้วยการดำเนินการของ T-SQL ต่อไปนี้:
exec sp_executesql N'proc1',N'@param1 int',@param1=1
เพิ่มเติม 23.12.15:การใช้CommandType.Text
คำสั่งผลลัพธ์จะคล้ายกัน: ทันทีที่มีการเพิ่มพารามิเตอร์ให้กับวัตถุคำสั่ง. NET จะตัดคิวรีทั้งหมดลงในsp_executesql
และส่งพารามิเตอร์ไปให้
เพิ่มเติม:หลังจากดำลึกเข้าไปในsp_executesql
พารามิเตอร์ดมกลิ่นและวางแผนการแคชพฤติกรรมของคลาส NET. นี้ทำให้รู้สึกโดยสิ้นเชิงเพื่อหลีกเลี่ยงการรวบรวมแบบสอบถามบ่อยและจำนวนแผน ดังนั้นโดยทั่วไปแล้วมันถูกออกแบบมาเพื่อให้แน่ใจว่าประสิทธิภาพของ SQL Server ที่ดีขึ้นโดยทั่วไปในขณะเดียวกันในเวลาเดียวกันอาจนำไปสู่ประสิทธิภาพที่ต่ำของแบบสอบถามบางอย่าง (ปัญหาการดมกลิ่นพารามิเตอร์) ที่ใช้กับค่าพารามิเตอร์ที่แตกต่างจากแผนแบบสอบถามเริ่มต้นที่สร้างขึ้น
ดู:
ตัวอย่างข้างต้นถูกสร้างขึ้นโดยใช้. NET Framework 4.5 และ SQL Server 2008 Developer Edition