[MSSQL] รู้หรือไม่ว่า WHERE IN (มันมีข้อจำกัดนะ)

พอดีลองพัฒนาโมดูล Compliance ขึ้นมาใหม่ และลองทำ Stress Test ดูว่า ระบบมันรองรับได้มากที่สุดแค่ไหน โดยลองส่ง Portfolio ทีมีหลายร้อย Port เข้ามาตรวจดู ปรากฏว่าเจอ Exception ดังรูป

ถ้ามาดู Exception Message แบบละเอียดหละ

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.

ซึ่งสาเหตุของมันเกิดจาก SQL ในส่วนของ WHERE IN (มันมีข้อจำกัด สำหรับ Microsoft SQL Server สามารถใส่ข้อมูล เข้าไปได้มากที่สุด 2100 ตัวเท่านั้น) โดยตัวอย่าง SQL IN เป็นแบบนี้

SELECT * 
FROM   INVEST.LIMITRULE 
WHERE  LIMITID IN (1
                  ,2
                  ,3
                  ,4
                  ,... 
                  ,1001,1002 
                  ,..., 2099
                  ,2100,2101)

แล้วจำนวนเท่าไหร่ ถึงเหมาะสม

  • อันนี้ผมก็ตอบไม่ได้ครับ แต่ถ้าผมเป็นคนพัฒนาระบบ ผมเลือก Database ที่ต้องใช้ เช่น Oracle. MSSQL และ DB2 หาข้อจำกัดของมัน แล้วเลือกค่าที่น้อยที่สุดครับ ถ้า Parameter ที่ส่งมามันเกิน เราก็แอบสลับแบาง แล้วค่อยๆ ดึงข้อมูลออกมานะ

แล้ว Database ของเจ้าอื่นๆ มีข้อจำกัดที่เท่าไหร่

  • Oracle ได้จำนวน 1,000 Parameter
  • DB2 ได้จำนวน 1,000 Parameter
  • MSSQL ได้จำนวน 2,100 Parameter

 


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.