Bcpを使用するときに、長いクエリで入力SQLファイルを指定するにはどうすればよいですか? -i
オプションを使用しようとしましたが、追加情報なしでコマンドラインエラーについて文句を言い続けます。これは可能ですか?
私に関する限り、BCPユーティリティはコマンドラインに直接書き込まれたTransact-SQLクエリのみをサポートします。例:
bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout Currency.Name.dat -T -c
その参照 「-i」オプションによると:
対話モード(-n、-c、-w、または-Nが指定されていない)を使用して一括コピーが実行されているときに、コマンドプロンプトの質問への応答を含む応答ファイルの名前を指定します。
sqlcmd Utility "-i"オプションとは異なることに注意してください。
SQLステートメントまたはストアード・プロシージャーのバッチを含むファイルを識別します。順番に読み取られて処理される複数のファイルを指定できます(...)
私は今日この問題を抱えており、少なくともアドホックな状況では、便利な回避策を見つけました。
一時テーブルは、接続権限を持つすべてのユーザーが作成できます。これは、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
お役に立てば幸いです。
複数行のクエリは、PowerShellを使用してbcpに簡単に与えることができます。
PS> $query = @'
select *
from <table>
'@
PS> bcp $query queryout <outfile> -d <database> -T -S <server> -c
試してみてください:
query=$( cat < /file.sql )
export query
bcp "${query}" queryout /home/file.csv
私は同じ問題に直面していましたが、あまり良いアプローチではないかもしれません。しかし、私は次のようなことをしました
bcp "declare @query nvarchar(max) set @query = (SELECT * FROM OPENROWSET(BULK 'F:\tasks\report_v2.sql', SINGLE_CLOB) AS Contents) exec sp_executesql @query" queryout %outFileName% /c /C RAW -S . -U sa -P 123 -d blog /T
そして、グローバル一時テーブルのように使用する場合、クエリの実行後にグローバル一時テーブル自体が削除されることを言わなければなりません。状況によってはこれを使用できません