
SQL Server 2005 で簡単なクエリを実行していて、sqlcmd 経由でファイルにエクスポートしたいと考えています。ヘッダーとクエリ メタデータ (影響を受ける行数) のない csv 形式で結果を取得したいと考えています。ヘッダーには実際に -h -1 を指定できますが、末尾のテキストを削除するにはどうすればよいでしょうか。
今私は
sqlcmd -S klingon -d stardb -i C:\testscript.sql -o C:\testresults.csv -h -1 -s ","
脚本はシンプルなもので、
select x, y, z from agent
残念ながら、結果は次のようになります。
24 aingles1 creablegs
25 tbails12 bull2dog12
26 jtaylor3 Leandon62606
27 forrestw1 nuke19211
(4 rows affected)
影響を受ける行数を示す最後の部分を削除する方法を説明したヘルプ ファイルが見つからないようです。
誰かアイデアありますか?
答え1
「SET NOCOUNT ON」オプションが必要になると思います。SQL スクリプトは次のようになります。
set nocount on
select x, y, z from agent
set nocount off
結果セットは次のようになります。
24 aingles1 creablegs
25 tbails12 bull2dog12
26 jtaylor3 Leandon62606
27 forrestw1 nuke19211
最後に行数を減算します。
答え2
sqlcmd.exe を使用して結果を CSV にエクスポートするときにすべてのメッセージを削除するには、クエリ自体の先頭に次のコード ブロックを追加します。
-- Suppress warnings and messages like (2 rows effected)
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
-- SQLCMD.exe batch command
:setvar SQLCMDERRORLEVEL 1
-- To Reenable
--:setvar SQLCMDERRORLEVEL 0
/**********************************************************************************
** DISABLING WARNINGS AND MESSAGES
** Disable "Changed database context to 'DatabaseName'." message in the CSV file when using
** SQLCMD.exe. You'll get a syntax error when executing this query in Management
** Studio if SQLCMD Mode is not enabled [Query] --> [SQLCMD Mode].
** :setvar SQLCMDERRORLEVEL 1 is used to disable messages like (152 Rows affected).
**********************************************************************************/
答え3
sqlcmd -S svr -d db ... | findstr /v "rows affected"
findstr
OS に組み込まれており、grep に似ています。その他のオプションについては findstr /? を参照してください。
列を削除するには、cut.exe
道具. 次のように実行します:
sqlcmd -S svr -d db ... | cut -c10-
これにより、文字 10 以降のみが出力されるため、行番号は削除されます。それに応じて 10 という数字を調整してください。次のフィールドを試すこともできます。
sqlcmd -S svr -d db ... | cut -f2-
これにより、フィールド 2 以降 (右側) のみが出力されます。