2011-11-08 31 views
14

Tôi đang sắp xếp các truy vấn khác nhau trong một SqlCommand dừng lô truy vấn khi tôi đạt đến giới hạn tham số 2100. Nếu lô của tôi có thông số 2100 hoặc 2099, tôi vẫn nhận được ngoại lệ.Các tham số tối đa SqlCommand ngoại lệ tại thông số 2099

Các mã kiểm tra sau ném 'quá nhiều thông số ngoại lệ' ngay cả khi số lượng các thông số nhỏ hơn 2100.

var parametersMax = 2099; 

var connection = new SqlConnection(@"Data Source=.;Integrated Security=SSPI;"); 
connection.Open(); 

var enumerable = Enumerable.Range(0, parametersMax); 

var query = string.Format("SELECT {0}", String.Join(", ", enumerable.Select(s => string.Format("P{0} = @p{0}",s)))); 

var command = new SqlCommand(query, connection); 

foreach(var i in enumerable) 
    command.Parameters.Add(string.Format("p{0}",i), i); 

// here: command.Parameters.Count is 2099 

var reader = command.ExecuteReader(); // throws: 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. 

Xét nhắn ngoại lệ và tài liệu ở đây: http://msdn.microsoft.com/en-us/library/ms143432.aspx Tôi đã chờ đợi để có thể có 2100 tham số trong một truy vấn, nhưng điều này dường như không đúng. Có ai biết tại sao không? Tui bỏ lỡ điều gì vậy?

(Tôi đang sử dụng SQL Server 2008 R2)

+3

Bạn đang sử dụng số lượng thông số lớn này để làm gì? Bạn đã cân nhắc sử dụng tham số có giá trị bảng thay thế chưa? –

+0

Nó có hoạt động với 2098/2097/etc không. Tôi nghĩ rằng có một tham số ReturnValue rằng SQL đã mặc định. –

+0

Tôi không thể sử dụng nó theo thiết kế, tôi ổn với việc tách các truy vấn thành nhiều lô. Tôi chỉ muốn biết tại sao tôi không thể sử dụng 2100 thông số như nó nói. – marcob

Trả lời

19

Lệnh gửi đến SQL Server là

exec sp_executesql 
      N'SELECT P0 = @p0, P1 = @p1, P2 = @p2...', 
      N'@p0 int,@p1 int,@p2 int...', 
      @p0=0,@p1=1,@p2=2... 

Lưu ý rằng 2 của các khe thông số trong cuộc gọi đến sp_executesql được đưa lên với NVARCHAR dây cho văn bản truy vấn và các định nghĩa tham số như vậy "chỉ" để lại 2.098 miễn phí cho bạn sử dụng.

+1

Tôi đã ở trước lỗi này (Có quá nhiều tham số trong câu lệnh EXECUTE này. Số tối đa là 2100.) nhận ra rằng vấn đề là số tham số sp_executesql. Cảm ơn rất nhiều! :) – marcob

+1

+1 cho câu trả lời này. Tôi đã có điều tương tự xảy ra với tôi. VS báo cáo command.Parameters.Count là chính xác 2100 và SQL Server đã chỉ ra rằng tôi đã có hơn 2100 tham số. Giáo dục lớp 3 của tôi nói với tôi điều gì đó không ổn. Với một số thử nghiệm, tôi thấy rằng 2098 là số lượng thông số tối đa thực sự. Vì vậy, thông báo lỗi là gây hiểu lầm từ một quan điểm ADO.NET để nói rằng ít nhất. Tôi đang thiết lập tối đa của tôi đến 2090 trong trường hợp Microsoft thay đổi thực hiện ADO.NET của họ. –

Các vấn đề liên quan