web-dev-qa-db-ja.com

SQL Server 2012-プログラムの実行を続行するにはメモリが不足しています。 (mscorlib)

最大180 Mbのsqlファイルがあります。 Microsoft SQL Server Managment Studio 2012でそれを開いて実行しようとすると、このエラーが発生します。 enter image description here 。何をしますか? Googleで調査しました。そして、いくつかの答えがありました。彼らが言う1つの解決策は、C#スクリプトを実行することでした。 こちらです 。しかし、実行方法がわかりません。とにかく、そのスクリプトが機能するかどうかはわかりません。手伝ってくれてありがとう。

3
Romo Daneghyan

Management Studioは、そのようなファイルを開くために180 MB以上のメモリを必要とします。これは、ファイルのテキスト全体をメモリに保存するだけでなく、IntelliSenseに必要なオブジェクトをロードし、あらゆる種類の解析と検証などを実行するだけです。 IntelliSenseをオフにすると幸運ですが、これらのアクティビティの一部は引き続き発生します。特にそれがすべて1つのバッチである場合。

C#のアプローチはこのファイルでは問題なく機能する可能性がありますが、存在する可能性のあるすべてのファイルを解析する方法が常にわかるような方法で記述されていないのではないかと思います。変数を宣言する場合を考え、#tempテーブルを使用します。など。あなたはおそらくはるかに良くなるでしょう:

  1. ファイルを複数のファイルに分割します。
  2. 正常なGOバッチセパレーターを散布して、Management Studioがスクリプトを1つの巨大なバッチとして処理しないようにします。
  3. management Studioでファイルを開く代わりに、BULK INSERT、bcp、SSIS、またはインポート/エクスポートを使用できるようにファイルを作成します。または、
  4. 個々のステートメントを異なる方法で構成する。例-次のような個別の挿入行を含む大きなインポートファイルがたくさんあります。

    INSERT INTO dbo.tablename(col,col,col) VALUES(value,value,value);
    INSERT INTO dbo.tablename(col,col,col) VALUES(value,value,value);
    INSERT INTO dbo.tablename(col,col,col) VALUES(value,value,value);
    INSERT INTO dbo.tablename(col,col,col) VALUES(value,value,value);
    

    代わりにこれを実行することで、ファイルの完全なサイズで巨大な量のスペースを節約できます。

    INSERT INTO dbo.tablename(col,col,col) VALUES(value,value,value),
      (value,value,value),(value,value,value),(value,value,value);
    

    現在のファイルがすべて挿入ステートメントである場合、これは大きなへこみになる可能性があります。ただし、 約1,000を超えるセットをグループ化しないでください であることに注意する必要があります。

    それだけでは問題を解決するにはおそらく不十分ですが、それでも一般的なIMHOの方が優れた戦略です。

また、最新バージョンを入手することをお勧めします(Expressを使用している場合は、 ここから入手 )。

ここで他の提案を見ることができます

3
Aaron Bertrand

SQLファイルを実行する必要がある場合は、 MSDNに記載されているsqlcmdを使用します。sqlcmd を使用してTransact-SQLスクリプトファイルを実行します。

これは私のためのトリックをしました:

sqlcmd -S serverName\instanceName -i script.sql  -o output.txt
4
Igoris Azanovas

そのC#スクリプトはファイルを読み取り、そこから各行を実行します。ファイルには1行のステートメントしか含まれていないため、これは問題なく機能します。ファイルのT-SQL構造が同じであれば、そのC#コードが機能します。 Notepadd ++でファイルを開くことで確認できます。

乾杯、

1
Paul Lucaciu