6

私は一日中、答えを求めてネットを探し回っています。どうやら tsql には、独自の気の利いたファイルへの書き込みコマンドがありません。ここに私のジレンマがあります

1 行の長さが 10K+ に達するロード ファイルを作成しています。SQL Server の varchar(MAX) 制限は 8000 であるため (私は信じています)、これらの行をいくつかの変数に分割しました。PRINT を実行しようとしましたが、ウィンドウ ペインでは 4000 が許可されています。回避策は、これらの壊れた行を一度に 1 つの変数で出力することですが、手作業では面倒になる可能性があるため、変数を 1 つずつ txt ファイルに書き込むことを検討することにしました。時間。

xpcommandshell を介して BCP を調べたところ、有望に見えました。問題は、この行をコマンド プロンプトで機能させることができたにもかかわらず、まったく同じ行が TSQL クエリで機能しないことでした。

declare @cmd varchar(8000)
select @cmd = 'bcp Client_DB "Select name from dbo.t_TagBuild_set" queryout "Desktop\LAMB\dummy.txt" -c -t, -T'
exec master..xp_cmdshell @cmd

bcp Client_DB "Select name from dbo.t_TagBuild_set" queryout "Desktop\LAMB\dummy.txt" -c -t, -Tコマンドプロンプトで完全に正常に動作します

このわずかな進歩にもかかわらず、私のマネージャーはその道を進みたがりませんでした。その代わりに、SQL で次の行を実行して sp_configure を有効にした後、sp_OACreate と sp_OAMethod を選択しました。 sp_configure 'Ole Automation Procedures', 1

このルートの最初の行の 1 つがこれです。

EXECUTE @hr = sp_OACreate  'Scripting.FileSystemObject' , @objFileSystem OUT

@hr は 0 を与えるので、それは良いことですが、@objFileSystem は 16711422 を生成し、@hr は最終的に -2146828218 になり、これはパーミッションだと思います。

私は本当に簡単なことを見つけることに途方に暮れていますが、新しい行を追加してプロセスを繰り返す前に、いくつかの変数に続けて書き込むためだけに具体的なものを見つけるのがますます難しくなっています。

誰かが BCP または sp_OACreate を理解するのを専門的に手伝ってくれるなら、ネットがほとんど役に立たないので、私は非常に感謝しています (そして、これは私が Microsoft 自身のサイトを見て答えを探すのに多くの時間を費やした後です)

4

3 に答える 3

2

BCP が機能しなかった理由は、信頼できるユーザーで xp_cmdshell から実行していたためです。xp_cmdshell は、スクリプトを実行しているユーザーの下では実行されません。a) bcp コマンドを変更して SQL ログイン/パスワードを使用するか、b) run as と資格情報を使用して実行するユーザーを制御できるため、ジョブを作成して実行します (xp_cmdshell ではありません)。その後、sp_start_job を使用して、スクリプト内でジョブを起動できます。

もう 1 つの適切なオプションは、SSIS パッケージを作成し、コマンド ライン (たとえば、bat ファイル) を介して実行するか、ジョブを介して再度実行することです。

于 2013-02-14T23:10:41.353 に答える
2

クエリのビューを作成し、 を使用して選択しますsqlcmd

declare @cmd varchar(8000)
select @cmd = 'sqlcmd -h-1 -W -S servername -d database -U username -P password -Q "SET NOCOUNT ON; select * from VIEW_NAME " -o "C:\OUTPUT\query.csv" '
exec master..xp_cmdshell @cmd

-h-1ヘッダーを削除します

SET NOCOUNT ON影響を受ける行をフッターから削除します

于 2013-08-20T22:53:57.703 に答える
1

これを使用してT-SQLのファイルに書き込むことができます(トリガーとして機能します):

--char(9) = \t

    DECLARE @filename nvarchar(1000);

    SET @filename = ' (echo '+@parameterA+ char(9) +@parameterB+ ... + char(9) +@ParameterN+') > e:\file1.txt && type e:\file1.txt >> e:\file2.txt';

    exec DatabaseName..xp_cmdshell @filename, no_output
于 2015-07-05T22:42:12.907 に答える