SQLServerインポートの問題の解決策
前提条件
あるSQLServerから別のSQLServerに(たとえば、実稼働環境からテスト環境に)データを移動するには、SQL ServerManagementStudioのデータベースオプションで使用できる「スクリプトの生成」機能を使用するのが理にかなっています。この操作の結果は、別のSQLServerで実行できるSQLコマンドを含むテキストファイルです。通常、これらのファイルは大きすぎてSQL Server Management Studioで実行できないため、 sqlcmdを使用する必要があります。 SQLServerインストールパッケージのコマンドラインユーティリティ。ほとんどの場合、ユーティリティはスムーズに機能し、追加のユーザーアクションは必要ありません。
問題の説明
まれに、 sqlcmd ユーティリティはインポートで失敗し、次のエラーが発生する可能性があります:「文字列の後に引用符が閉じられていません...」これは、SQLクエリの1つが実行されていないことを示します。これは、 sqlcmdが原因で発生します ストリーム処理を使用して機能します。つまり、データの一部を読み取り、処理し、次の部分を読み取ります。場合によっては、入力ファイルに、 sqlcmdで処理できるデータの量よりも大きいサイズの巨大なSQL命令が含まれていることがあります。 一度に、 sqlcmd 壊れたSQLを実行しようとして失敗します。
考えられる解決策
この問題を修正するには、2つのアプローチを使用できます。
-
sqlcmd ユーティリティは、処理中に使用されるパケット(データの一部)の最大サイズを定義する「-a」パラメータを受け入れることができます。最大値は32767、デフォルト値は4096であるため、常にこのパラメーターを最大値で使用するのが理にかなっています。
sqlcmd -i input.sql -a 32767 -o import_log.txt
-
最初のアプローチが役に立たず、問題がまだ発生する場合は、別のより難しい解決策があります:
- Cygwinをインストールする
- インストール中、いくつかの標準画面の後、「パッケージの選択」画面で停止します
- [検索]フィールドに「sed」と入力し、下のツリーで[ベース]カテゴリを展開して、インストール用に4.2.2以上のバージョンを選択します
- 完全なインストール
- 注:「sed」は、ストリームベースのファイル処理を可能にするLinuxユーティリティです
- インストールが完了したら、デスクトップから「Cygwin64ターミナル」を実行します。次のステップで使用します
-
SQL ServerManagementStudioによって生成されたSQLファイルが配置されているディレクトリに移動します。 「\」であるWindowsスタイルの代わりにLinuxスタイルのスラッシュ「/」を使用する必要があります
cd d:/temp
-
SQLファイルのエンコーディングをUTF-16LEからUTF-8に変更します。「sed」はUTF-16LEを処理できないため、この変換はデータにとって安全です。結果は新しいファイルになり、次のステップで使用します
iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
-
新しいファイルを変換して、1つのバッチに1つのSQLクエリを作成します。結果は新しいファイルになり、次のステップで使用します
sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
-
これで、ファイル「input_utf8_adapted.sql」はsqlcmdによって問題なく処理されるはずなので、以下を実行できます。
sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
-
実行が完了したら、import_log.txtをチェックして、エラーが表示されていないことを確認してください
- Cygwinをインストールする