2011-11-08 142 views
14

2100パラメータの制限に達したときに、1つのSqlCommandで異なるクエリをバッチしてクエリのバッチを停止しています。私のバッチに2100または2099のパラメータがある場合、私はまだ例外を取得します。 http://msdn.microsoft.com/en-us/library/ms143432.aspx私のことができるようにするために期待していた次のテストコードは、パラメータの数が未満21002099パラメータでのSqlCommandの最大パラメータ例外

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. 

は例外メッセージと、ここで文書を検討している場合でも、「あまりにも多くのパラメータ例外」をスローし

1つのクエリに2100のパラメータがありますが、これは真実ではないようです。なぜ誰が知っていますか?何か不足していますか?

は、SQL Serverに送信

+3

この数多くのパラメータをどのように使用していますか?代わりにテーブル値のパラメータを使用することを検討しましたか? –

+0

2098/2097 /などで動作しますか?私は、SQLがデフォルトで持つReturnValueパラメータがあると思います。 –

+0

私は設計でそれを使用することはできません、私は複数のバッチでクエリを分割しても問題ありません。私はそれが言うように2100パラメータを使用できない理由を知りたがっています。 – marcob

答えて

19

コマンドはsp_executesqlの呼び出しのパラメータスロットの2がNVARCHAR文字列で取り上げていること

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

注意です(私は、SQL Server 2008 R2を使用しています)クエリテキストとパラメータ定義のために "唯一の" 2,098あなたが使用するために自由に残します。

+1

問題がsp_executesqlパラメータのカウントであることを認識して、このエラーが発生しました(このEXECUTE文にはパラメータが多すぎます。最大数は2100です)。 ありがとう! :)この回答は – marcob

+1

+1です。私も同じ事が私に起こっていた。 VSはcommand.Parameters.Countが正確に2100であり、SQL Serverが2100を超えるパラメータを持つことを示していました。私の3年生の教育は、何かがうんざりしていると私に言ったいくつかの実験で、私は2098が真の最大数のパラメータであることを発見しました。そのため、エラーメッセージは、ADO.NETの観点から、誤解を招くものではありません。 MicrosoftがADO.NETの実装を変更した場合、私は最大値を2090に設定しています。 –

関連する問題