この質問は、実際にここで時々出てくるようです。 マーク は正しい (そして最も一般的に採用されている) 答えを持っていますが、これをより明確にするためにできることを追加してみましょう.
エラー メッセージは少し誤解を招きます。 SQL Server は、実行するのに十分なメモリがないことを通知します クエリですが、実際には解析するのに十分なメモリがないことを意味します
ランニングに関しては クエリ、SQL Server は必要なすべてを使用できます-必要に応じてギガバイト。解析は別の話です。サーバーは解析ツリーを構築する必要があり、そのために使用できるメモリの量は非常に限られています。 INSERT
でいっぱいの典型的なバッチを除いて、どこにも文書化された実際の制限を見つけたことがありません ステートメントでは、一度に数 MB 以上を処理することはできません。
申し訳ありませんが、できません SQL Server がこのスクリプトを記述どおりに実行するようにします。どんな設定を微調整しても構いません。ただし、これを回避するためのいくつかのオプションがあります:
具体的には、次の 3 つのオプションがあります。
<オール> <リ>
GO
を使用 ステートメント。これは、SSMS やその他のさまざまなツールでバッチ区切りとして使用されます。スクリプト全体に対して単一の解析ツリーが生成される代わりに、GO
で区切られたバッチの各セグメントに対して個別の解析ツリーが生成されます。 .これはほとんどの人が行うことであり、他の人が実証したように、スクリプトをトランザクション的に安全にするのは非常に簡単です。ここでは繰り返しません。
すべての行を挿入する大規模なスクリプトを生成する代わりに、データをテキスト ファイルに保存します (つまり、カンマ区切り)。 bcp ユーティリティ
を使用してインポートします。 .これを「スクリプト可能」にする必要がある場合 - つまり、CREATE TABLE
と同じスクリプト/トランザクションでインポートを行う必要がある場合 BULK INSERT
を使用します。 代わりは。 BULK INSERT
でも 信じられないかもしれませんが、ログに記録されない操作であり、 BEGIN TRAN
内に配置できます / COMMIT TRAN
ブロックします。
あなたが本当に、本当に INSERT
が欲しいなら ログに記録された操作であり、挿入をバッチで発生させたくない場合は、 OPENROWSET
テキスト ファイル、Excel ファイルなどをアドホックな「テーブル」として開き、これを新しく作成したテーブルに挿入します。通常、OPENROWSET
の使用を推奨するのは嫌です。 ですが、これは明らかに管理スクリプトであるため、実際には大きな問題ではありません。
以前のコメントは、あなたが #1 に不快感を覚えていることを示唆していますが、それは単に 1 回のトランザクションで実行できないという誤った仮定が原因である可能性があります。その場合は トーマス
の答え。しかし、別の方法に行き詰っている場合は、#2 に進み、テキスト ファイルを作成して BULK INSERT
を使用することをお勧めします。 . 「安全な」スクリプトの例:
BEGIN TRAN
BEGIN TRY
CREATE TABLE MyTable (...)
BULK INSERT MyTable
FROM 'C:\Scripts\Data\MyTableData.txt'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\r\n',
BATCHSIZE = 1000,
MAXERRORS = 1
)
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
うまくいけば、これがあなたを正しい軌道に乗せるのに役立ちます.これは、利用可能な「ボックス内」オプションのすべてをカバーしていると確信しています-これらを超えて、実際のアプリケーションプログラムまたはシェルスクリプトを作成して作業を開始する必要があり、複雑さのレベルはそれほど高くないと思います