1. ホーム
  2. sql

[解決済み] SQL Server クエリの最大サイズ?IN句?より良い方法はありますか[重複]?

2023-01-26 13:36:31

質問

重複の可能性があります。

T-SQL WHERE col IN (...)

SQL Server のクエリの最大サイズは何ですか?(文字数)

IN句の最大サイズ?Oracleの場合、1000アイテムの制限があると何かで見た気がしますが、2つのINをANDでつなげば回避できるかもしれません。SQL Serverでも同様の問題がありますか?

UPDATE 他のシステム(非リレーショナルデータベース)から1000 GUIDを取得し、SQL Serverに対して"JOIN in codeを行う必要がある場合、最良の方法は何でしょうか?1000のGUIDのリストをIN句に提出することでしょうか? または、より効率的に動作する別のテクニックがありますか?

私はこれをテストしていませんが、GUID を XML ドキュメントとして提出することができるでしょうか。たとえば

<guids>
    <guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
    <guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>

で、DocとTableに対してある種のXQuery JOINを行います。1000項目のIN句より効率が悪い?

どのように解決するのですか?

すべての SQL バッチは バッチサイズ制限 : 65,536 * ネットワークパケットサイズに収まる必要があります。

それ以外のクエリは、実行時の条件によって制限されます。x IN (a,b,c) は x=a OR x=b OR x=c に過ぎず、x=a OR (x=b OR (x=c)) と同様の式木を作成するので、多数の OR で非常に深くなるため、通常はスタック サイズを使い果たすことになります。SQL 7ならSOに当たる の値が10k程度で、IN の値が10k程度でSO

アップデート

Erland の記事で、SQL Server にリスト/配列を渡すというトピックが既に見つかりましたね。SQL 2008 では テーブル値パラメータ があり、DataTable全体をひとつのテーブル型パラメータとして渡し、その上で結合することができます。

XMLとXPathはもう一つの有効な解決策です。

SELECT ...
FROM Table
JOIN (
   SELECT x.value(N'.',N'uniqueidentifier') as guid
   FROM @values.nodes(N'/guids/guid') t(x)) as guids
 ON Table.guid = guids.guid;