2011-11-08 26 views
14

我在一個SqlCommand中批處理不同的查詢,當我點擊2100參數限制時停止查詢批處理。如果我的批處理有2100或2099個參數,我仍然會遇到異常。SqlCommand最大參數異常在2099參數

下面的測試代碼引發「太多參數異常」即使參數的數量少於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. 

考慮異常消息,這裏的文檔:http://msdn.microsoft.com/en-us/library/ms143432.aspx我期待能在一個查詢中有2100個參數,但這似乎不是真的。有誰知道爲什麼?我錯過了什麼嗎?

(我使用SQL Server 2008 R2)

+3

你在使用這麼多的參數?您是否考慮過使用表值參數? –

+0

它是否適用於2098/2097 /等。我認爲SQL有默認的ReturnValue參數。 –

+0

我不能使用設計,我很好地分裂多個批次的查詢。我只是想知道爲什麼我不能使用2100參數。 – marcob

回答

19

命令發送到SQL Server是

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

注意,在調用sp_executesql參數插槽2採取了與NVARCHAR串對於查詢文本和參數定義,因此「僅」可以讓2,098免費供您使用。

+1

我在這個錯誤的前面(有這個EXECUTE語句的參數太多,最多隻能爲2100)意識到問題是sp_executesql的參數計算。 非常感謝! :) – marcob

+1

+1這個答案。我有同樣的事情發生在我身上。 VS報告command.Parameters.Count正好是2100,SQL Server表明我有超過2100個參數。我的三年級教育告訴我有什麼不對勁。通過一些實驗,我發現2098是真正的最大參數數量。所以,從ADO.NET的角度來看,錯誤信息是誤導性的,至少可以說。我將我的最大值設置爲2090,以防Microsoft改變其ADO.NET實現。 –