bcp を使用する場合、長いクエリで入力 SQL ファイルを指定するにはどうすればよいですか? このオプションを使用してみ-i
ましたが、追加情報なしでコマンド ライン エラーが表示され続けます。これは可能ですか?
9 に答える
今日この問題が発生し、少なくともその場しのぎの状況では、便利な回避策を見つけました。
一時テーブルは、接続権限を持つすべてのユーザーが作成できます。これは、GLOBAL 一時テーブルも作成できることを意味します。
グローバル一時テーブルで SELECT ...INTO を使用して、エンタープライズ マネージャー (または sql cmd など) でクエリを実行するだけです。
SELECT *
INTO ##mytemptable
FROM SomeTable
WHERE [massive where clause, for example]
その後、簡単な BCP クエリで一時テーブルを使用できます。
SELECT * FROM ##mytemptable
次に、エンタープライズ マネージャーを使用して一時テーブルをドロップします。
DROP TABLE ##mytemptable
私はそれを修正するために別の方法をとった。
ファイルを読み取り、コンテンツをbcpコマンドで送信するバッチ ファイルを作成します。見る:
@ECHO off
SETLOCAL EnableDelayedExpansion
SET queryFile=%1
SET outFileName=%2
FOR /F "delims=" %%i IN (%queryFile%) DO SET join=!join! %%i
ECHO %join%
bcp "%join%" queryout %outFileName% /S.\SQLE_CAESAR /d /c /t"|" /T
そのスクリプトは 2 つのパラメーターを受け取ります。
- クエリを含むファイル名。
- エクスポート データのファイル名。
次のように cmd でスクリプトを実行します: export-query.bat query.sql export.txt
お役に立てば幸いです。
私の知る限り、BCP ユーティリティは、コマンド ラインに直接記述された Transact-SQL クエリのみをサポートしています。元:
bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout Currency.Name.dat -T -c
その参照によると、「-i」オプション:
対話型モード (-n、-c、-w、または -N を指定しない) を使用して一括コピーを実行するときに、各データ フィールドのコマンド プロンプトの質問に対する応答を含む応答ファイルの名前を指定します。
sqlcmd ユーティリティの"-i" オプションとは異なることに注意してください。
SQL ステートメントまたはストアド プロシージャのバッチを含むファイルを識別します。順番に読み取られて処理される複数のファイルを指定できます (...)
複数行のクエリは、powershell を使用して簡単に bcp に与えることができます。
PS> $query = @'
select *
from <table>
'@
PS> bcp $query queryout <outfile> -d <database> -T -S <server> -c