สามารถกำหนดค่า / ใช้ sp_executesql เป็นค่าเริ่มต้นได้หรือไม่


10

ฉันกำลังดูแอปพลิเคชันที่ใช้การสืบค้น SQL แบบไดนามิกสูงกับ SQL Server ดูคำถามที่สร้างขึ้นด้วยวิธีที่แปลกและซับซ้อนมาก แต่นั่นเป็นเรื่องที่แตกต่างฉันบอกให้เหตุผลที่ดีสำหรับฉันที่ไม่สามารถ (โง่เกินไป) เพื่อค้นหาสิ่งต่าง ๆ ด้วยตัวเอง ... ฉันมองไม่เห็น รหัสใด ๆ sp_executesqlที่คำสั่งจะถูกห่อด้วย

sp_executesqlแต่เมื่อผมติดตามฉันสามารถดูจำนวนมากของคำสั่งที่มาในห่อด้วย โซลูชันแอปพลิเคชันทั้งหมดไม่มีแม้แต่คำสั่งsp_executesqlเลย

ดังนั้นฉันสงสัยว่ามีการกำหนดค่าชนิดใดที่ฉันยังไม่รู้ซึ่งบังคับให้ซอฟต์แวร์ตัดคำสั่งด้วย sp_executesql โดยค่าเริ่มต้นหรือไม่

สิ่งที่อาจทำให้เกิดพฤติกรรมนี้

คำตอบ:


11

เหตุผลที่คำสั่ง 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


5

หากนี่เป็นแอปพลิเคชั่น. NET แสดงว่าเป็นไปได้อย่างมากว่าผลลัพธ์ของSqlCommand.ExecuteReader ()จะถูกเรียก ตามหน้าคลาสหลักของSqlCommandในตารางของคำอธิบายวิธีการในส่วน "หมายเหตุ" ภายใต้ExecuteReaderมันบอกว่า:

ดำเนินการคำสั่งที่ส่งคืนแถว เพื่อประสิทธิภาพที่เพิ่มขึ้น ExecuteReader จะเรียกใช้คำสั่งโดยใช้ Transact-SQL sp_executesqlระบบที่จัดเก็บ ดังนั้น ExecuteReader อาจไม่มีผลกระทบที่คุณต้องการหากใช้เพื่อดำเนินการคำสั่งเช่นคำสั่ง Transact-SQL SET

ผมไม่ได้มีเวลาในขณะนี้ในการทดสอบนี้เพื่อยืนยันคำอธิบายของพวกเขา SqlParameterแต่มันควรจะเพียงพอที่ง่ายต่อการสร้างแอพพลิเคคอนโซลง่ายๆที่ไม่ได้โทรง่ายมากผ่านในข้อความแบบสอบถามบางส่วนและรวมทั้งพารามิเตอร์ที่จะมาพร้อมกับที่ ฉันเดาว่าExecuteNonQueryและExecuteScalarใช้sp_executesqlเนื่องจากพวกเขายังอนุญาตให้ส่งผ่านพารามิเตอร์ดังนั้นทำไมจึงมีเส้นทางที่แตกต่างกันสำหรับวิธีการดำเนินการเหล่านั้นหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.