web-dev-qa-db-ja.com

SQLcmdウィンドウで結果を印刷する方法

これらのクエリの結果をSQLcmdウィンドウに表示しようとしています。

SELECT SYSDATETIME() AS "date";

PRINT 'EXTRAÍDO POR:'
SELECT SUSER_NAME() AS "Owner"

PRINT 'PASSWORD SETTINGS';
exec xp_loginconfig;

PRINT 'PASSWORD SETTINGS';
select * from sys.sql_logins;

そして、SQLcmdでこのコマンドを使用します。

sqlcmd -S myServer -i inputpath -s, -o outputPath(like C:\log.xls) -e

したがって、sqlcmdはファイルを出力し、sqlcmd画面には何も表示しません。これらの「印刷」コマンドをsqlcmd画面で印刷するにはどうすればよいですか? (コマンドプロンプト)。

SSMSで実行すると、次のようにうまく機能します。

(1行が影響を受けました)OWNER:

(1行が影響を受けます)パスワード設定

(8行が影響を受けます)パスワード設定

SSMSのように、これをプロンプトコマンドで表示したいと思います。

ありがとう!

1
Lucas

SQLCMD.EXEall出力をファイルに送るように指示しているため、コマンドウィンドウには何も表示されません。 _-o_スイッチを使用します。結果をファイルに送信し、メッセージを画面に(ファイルにではなく)送信する場合は、_-o_スイッチを使用できません。

代わりに、_>_のように、コマンドラインで_> log.xls_を使用して、出力(つまり "stdout")を手動でファイルにリダイレクトする必要があります。ただし、デフォルトでは、PRINTメッセージも「stdout」に送信されるため、_-r1_スイッチを使用してそれらを「stderr」に送信する必要があります(そのため、ファイル)。 (C:\への書き込みは良い習慣ではないので、多分[〜#〜] temp [〜#〜]ディレクトリ/フォルダーを作成し、またはそのようなもの):

_SQLCMD -S (local) -i script.sql -s, -e -r1 > C:\TEMP\log.xls
_

コマンドウィンドウに次のように表示されます。

EXTRAÍDOPOR:
パスワード設定
パスワード設定

「(18行に影響あり)」は出力ファイルに残ります。これをファイルではなくウィンドウに表示したい場合は、次のことを行う必要があります。

  1. SQLスクリプトのtopに_SET NOCOUNT ON;_を追加します
  2. 各T-SQLクエリの後に(つまり、このスクリプトのSELECTおよびEXECの後に)PRINT '(' + CONVERT(VARCHAR(10), @@ROWCOUNT) + ' rows affected)';を追加します。

これらの2つの手順を実行すると、コマンドウィンドウに次のように表示されます。

(1行が影響を受けました)
EXTRAÍDOPOR:
(1行が影響を受けました)
パスワード設定
(8行が影響を受けます)
パスワード設定
(18行が影響を受けました)

また:

  1. script.sqlの元のSQLクエリを出力ファイルの先頭に送信すると、Excelで開くときに問題が発生する場合、_-e_スイッチを削除する必要がある場合があります( 。xlsファイル拡張子を指定して実行したい)。
  2. OSの地域設定と、ログインのデフォルトデータベースのデフォルト照合に関連付けられているコードページによっては、_Í_文字が正しく表示されるように、コマンドウィンドウの現在のコードページを変更する必要がある場合があります。

    意味:私は米国にいるので、コマンドウィンドウのデフォルトコードページは437ですが、ログインのデフォルトデータベースの照合順序は、コードページ1252を使用する_Latin1_General_*_照合順序です。SSMSでは、_PRINT 'EXTRAÍDO POR:'_は次のように表示されます。 :

    EXTRAÍDOPOR:

    [メッセージ]タブ。 しかし、、コマンドプロンプトウィンドウに次のように表示されます:

    EXTRAIDO POR:

    コマンドプロンプトに「Í」ではなく「I」が表示される。これを修正するには、コマンドプロンプトウィンドウで次を実行する必要がありましたbeforerunning [〜#〜] sqlcmd [〜#〜]

    _chcp 1252
    _

追伸いいえ、このスクリプトではGOは必要ありません。

1
Solomon Rutzky

PowerShellを使用する場合は、次のようなことができます。

sqlcmd -i inputpath -S myServer -E -d MYDB | Tee-Object -file "C:\log.xls"
1
Scott Hodgin