選択結果をcsvファイルに書き込む


37

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

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

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

前もって感謝します。

回答:


52

BCPユーティリティを使用する

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

-c引数の指定C haracter出力、SQLのネイティブバイナリ形式とは反対に、これは、タブ区切りのデフォルトが、-t ,フィールドの変更トンのカンマにerminatorを。 -T指定Windows認証(「T錆び接続」)、それ以外を使用-U MyUserName -P MyPassword

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

または

SQLCMDを使用する

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

または

Powershellを使用する

ここに記事へリンクがあります。これを使用することになった場合は、出力ファイルの不要な列を取り除くために-notypeExport-Csv $extractFileから追加することをお勧めします。


4
+1 BCPユーティリティの場合-これは非常に使いやすく、情報のエクスポート/インポートに使用した中で最も高速なツールであり、多くのオプションがあります。ステートメントの最後に「> FileName.log」を追加することをお勧めします。これにより、ログファイルが作成されます。
gotqn

24

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

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

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


10

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ファイルの最初の行がすべてのフィールドの区切りリストであることを確認してください。

1
これまでのベストアンサー!
アジェ

1
警告を含む素晴らしい仕事
JJS

5

ローテク、しかし...

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

MySQLはcol1 + ',' + cast(col2 as varchar(10)) + ',' + col3列名として扱い、いたるところにNULLを出力します。
Nikhil Wagh

4

すでに許容可能な解決策があるように見えますが、db mailを設定している場合は、次のようなことを実行できる可能性があります。

EXEC msdb.dbo.sp_send_dbmail
    @recipients='your.email@domain.com',
    @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

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


ちょうど私が探していたもの、あなたへの称賛!
Mashchax

ユーザーのデフォルトのプライベートプロファイルもデータベースのパブリックプロファイルもない場合は、@ profile_nameパラメーターを追加する必要があります。
Mashchax

1

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

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

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

    このタイプのクエリは実行の一部としてテーブルを作成するため、クエリの実行時にはこのテーブル存在できません

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

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

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

    Drop Table dbo.LogTableName

3
こんにちはドン。回答に書式を追加しました。左下の[編集]をクリックして変更内容を確認し、[編集済み] xx分ビットをクリックして、ロールバックする場合に完全な履歴を表示できます。すでに何を書かれており、多くの注目を集めることはほとんどありませんされています。
マイケル・グリーン

0

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"

-1

この手順では、パラメーターとして渡すクエリの出力を含むCSVファイルが生成されます。2番目のパラメーターはCSVファイル名です。有効な書き込み可能なパスでファイル名を渡すようにしてください。

プロシージャを作成するスクリプトは次のとおりです。

CREATE procedure [dbo].[usp_create_csv_file_from_query]
    @sql Nvarchar(MAX),
    @csvfile Nvarchar(200)
    as
    BEGIN
        if IsNull(@sql,'') = '' or IsNull(@csvfile,'') = ''
        begin
            RAISERROR ('Invalid SQL/CsvFile values passed!; Aborting...', 0, 1) WITH NOWAIT
            return
        end
        DROP TABLE if exists global_temp_CSVtable;
        declare 
            @columnList varchar(4000), 
            @columnList1 varchar(4000),
            @sqlcmd varchar(4000),
            @dos_cmd nvarchar(4000)

        set @sqlcmd = replace(@sql, 'from', 'into global_temp_CSVtable from')
        EXECUTE (@sqlcmd); 

        declare @cols table (i int identity, colname varchar(100))
        insert into @cols
        select column_name
        from information_schema.COLUMNS
        where TABLE_NAME = 'global_temp_CSVtable'

        declare @i int, @maxi int
        select @i = 1, @maxi = MAX(i) from @cols

        while(@i <= @maxi)
        begin
            select @sql = 'alter table global_temp_CSVtable alter column [' + colname + '] VARCHAR(max) NULL'
            from @cols
            where i = @i
            exec sp_executesql @sql
            select @i = @i + 1
        end

        SELECT 
             @columnList = COALESCE(@columnList + ''', ''', '') + column_name 
            ,@columnList1 = COALESCE(@columnList1 + ', ', '') + column_name
        from information_schema.columns
        where table_name =  'global_temp_CSVtable'
        ORDER BY ORDINAL_POSITION;

        SELECT @columnList = '''' + @columnList + '''';

        SELECT @dos_cmd='BCP "SELECT ' + @columnList + 
                        ' UNION ALL ' +
                        'SELECT * from ' + db_name() + '..global_temp_CSVtable" ' + 
                        'QUERYOUT ' + @csvfile + 
                        ' -c -t, -T'
        exec master.dbo.xp_cmdshell @dos_cmd, No_output 
        DROP TABLE if exists global_temp_CSVtable;
    end

2
ここではコードのみの回答は受け入れられるとは見なされません-回答にコメントを追加して、なぜ機能するのでしょうか?(コードコメントはおそらくここでも役立つでしょう)
George.Palacios

はい、それを正常に使用する方法として例を追加できますか?
マルチェロミオレッリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.