2

リンク サーバー通信を回避するために、2 つの異なる SQL Server にアクセスする 2 つのクエリがあります。最初のクエリは OrderID のリストを取得します。次の形式のように、C# を使用してそれらを文字列に整理し、2 番目のクエリに渡します。

Select .....
From .....
Where OrderID in (1,2,3,4,5,6)

-- 1,2,3,4,5,6 は最初のクエリの結果からの処理です。

最初のクエリから多数の orderID が取得されると、2 番目のクエリがタイムアウトすることがわかりました。

「IN」句に渡すことができる要素の数はありますか?

4

3 に答える 3

3

これが問題になるほど多くの要素を渡す必要がある場合は、使用済みの定義済みtable valued parameterパラメーター (リストを含む必要があります) を持つストアド プロシージャを検討する必要があります。

編集: http://blogs.msdn.com/b/felixmar/archive/2010/10/27/how-to-create-and-execute-a-stored-procedure-using-a-table-as-aを参照-parameter.aspx

于 2013-05-16T14:57:54.693 に答える
1

厳しい制限がありますが、非常に高いです。その制限に達すると、タイムアウトにはなりませんが、クエリを実行することをまったく拒否します。

あなたの場合、クエリの実行に時間がかかりすぎています。ただし、「in」配列内のアイテムが多いほど、実行することが増えるため、クエリの実行に時間がかかります。クエリに時間がかかりすぎると、発見したとおりにタイムアウトします。

これは制限ではなく、許容範囲に関するものです。

おそらく試してみるべきことは、クエリをページ分割して、一度に 100 行程度に制限し、複数のクエリを実行することです。

Entity Framework のような ORM の使用を検討することもできます (C# タグはありますが、ここには C# がないので、それがあなたがいると仮定しています) - 次に、次のようになります。

Orders.Where(o => OrderIDs.Contains(o.OrderID)).Skip(100).Take(100);

それは私の個人的な偏見ですが、それがあなたにとって良いかどうかについては、ほんの少しの塩です.

于 2013-05-16T14:59:58.407 に答える
-1

2100要素です。ドキュメントを参照してください。

于 2013-05-16T14:56:09.373 に答える