web-dev-qa-db-ja.com

選択結果をcsvファイルに書き込んでいます

SELECTクエリの結果をcsvファイルに書き込む必要があります。 SQL Server 2008 r2でT-SQLを使用してどのように実行できますか? SSISで実行できることは知っていますが、いくつかの理由により、このオプションはありません。

以下の記事で推奨されるprocを使用しようとしましたが、procを実行すると、このprocで呼び出されるsys.sp_OACreateおよびsys.sp_OADestroyを実行できないというSQLのエラーメッセージが表示されます。

これらのコンポーネントを有効にする方法、またはT-SQLを使用してファイルに書き込むより良い方法を知っていますか?

前もって感謝します。

39
Sky

使用 BCPユーティリティ

bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T

-c引数は、SQLのネイティブバイナリ形式ではなく、c文字出力を指定します。これはデフォルトでタブで区切られた値になりますが、-t ,はフィールドtの改行文字をカンマに変更します。 -TはWindows認証を指定します( "trusted connection")、それ以外の場合は-U MyUserName -P MyPasswordを使用します。

デフォルトでは、列ヘッダーはエクスポートされません。ヘッダーにはUNION ALLを使用する必要があります

OR

SQLCMDを使用する

SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable"
-s "," -o "D:\MyData.csv" 

OR

Powershellを使用する

これが 記事へのリンク です。最終的にこれを使用する場合は、-notypeの後にExport-Csv $extractFileを追加して、出力ファイルの不要な列を取り除くことができます。

53
RK Kuppala

アクションを自動化するのに役立つ前の回答に追加します。必要な場合に限り、Management Studioで実行できますヘッダーを右クリック-名前を付けて保存-> .csvを選択ファイル

または、実行する選択ステートメントごとにそれを行う場合は、結果の出力方向をファイルに変更できます。 ツール->オプション->クエリ結果-ファイルへの結果を使用します。

簡単に自動化でき、SSISを利用するもう1つの方法は、Management Studioのデータのエクスポート機能を使用することです。 データベースを右クリック->タスク->データのエクスポートそこには多くのオプションを持つウィザードがあります。ソースデータベース、宛先、その他のオプションを選択する必要があります。保存先については、「フラットファイル」であることを確認し、.csvタイプを参照して選択し、必要なフォーマットを選択します。最後に、ローカルに保存して必要に応じて繰り返すことができるSSISパッケージを取得します。

24
Marian

T-SQLを使用する

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

ただし、注意点がいくつかあります。

  1. Microsoft.ACE.OLEDB.12.0プロバイダーを使用可能にする必要があります。 Jet 4.0プロバイダーも機能しますが、それは古いものなので、代わりにこれを使用しました。
  2. .CSVファイルは既に存在している必要があります。ヘッダー(HDR = YES)を使用している場合は、.CSVファイルの最初の行がすべてのフィールドの区切りリストであることを確認してください。

ローテクですが...

select
   col1 + ','
+  cast(col2 as varchar(10)) + ','
+  col3
from mytable;
5
Alain

すでに受け入れ可能な解決策があるように見えますが、db mailがセットアップされている場合は、次のようなことを行うことができます。

EXEC msdb.dbo.sp_send_dbmail
    @recipients='[email protected]',
    @subject='CSV Extract', 
    @body='See attachment',
    @query ='SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable',
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'CSV_Extract.txt',
    @query_result_separator = ',',
    @query_result_header = 1

とにかくどこかにファイルを電子メールで送信している場合は、いくつかの手順を省略できます。

4
Shane Estelle

これは、3つのステップのプロセスで簡単に実行できます。

  1. クエリをSELECT INTOクエリとして記述します。これは基本的にクエリ結果をテーブルにエクスポートします。

    Select
      Field1
     ,Field2
     ,Field3
    INTO dbo.LogTableName         --Table where the query Results get logged into.
    From Table
    

    このタイプのクエリは実行の一部としてテーブルを作成する必要があるため、このテーブルcannotはクエリの実行時に存在します。

  2. 次に、SSISを使用して、そのテーブルの結果を.csvにエクスポートします。 SSISエクスポートウィザードでは、区切り文字などを選択できます。これは、|を使用するのに非常に便利です。結果セットにコンマが含まれる場合の区切り文字。

    DB Name > Tasks > Export Dataを右クリック

  3. エクスポートが完了したら、DROP TABLEコマンドを実行してログテーブルをクリーンアップします。

    Drop Table dbo.LogTableName
    
1
Don Moehling

MS Access DoCMDを使用して、SQL ServerからCSVをエクスポートします。それは単一のコマンドでそれを行うことができます。アクセスデータベースは、アクセスコマンドを有効にするためにのみ使用されます。これはうまく機能し、追加の利点(理由は不明)として、エクスポートされたテーブルのschema.iniを作成します。

アダム

CMD="SELECT * INTO [Text;HDR=Yes;DATABASE=C:\].[Results.txt]  
FROM [ODBC;DSN=SQL2017;Description=SQL2017;UID=.;Trusted_Connection=Yes;APP=Microsoft Office 2013;WSID=LAPTOP-XYZ;DATABASE=TempDB_DataDump_1].Results "

 Set appAccess = CreateObject("Access.Application") 
                appAccess.OpenCurrentDatabase "anyAccessdatabase.mdb" 
                   ' appAccess.DoCmd.SetWarnings 0
                    appAccess.DoCmd.runsql "CMD"
0
Adam