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

以下の記事で提案されているプロシージャを使用しようとしましたが、プロシージャを実行するとSQLこのプロシージャで呼び出されるsys.sp_OACreateとsys.sp_OADestroyを実行できないと文句を言います。

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

よろしくお願いします。

回答

BCPユーティリティ

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

-c引数は c SQLのネイティブバイナリ形式とは対照的なハラクター出力。これはデフォルトでタブ区切りの値になりますが、-t ,フィールド t をカンマに変更します。-TはWindows認証を指定します( “ t 錆びた接続 “)、それ以外の場合は-U MyUserName -P MyPasswordを使用します。

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

または

SQLCMDを使用

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

または

Powershellを使用する

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

コメント

  • +1 BCPユーティリティの場合-非常に使いやすく、これまでエクスポート/インポートに使用した中で最速のツールです。情報と多くのオプションがあります。 ” > FileName.log “を最後に追加することをお勧めしますステートメント-これによりログファイルが作成されます。
  • GUIプログラムに関連する回答はすべて範囲外です。これは、DBAの観点から見た最良のソリューションです!

回答

前の回答に追加します。アクションを自動化するのに役立ちます。必要な場合は、Management Studioで実行できます。ヘッダーを右クリックし、結果を名前を付けて保存し、を選択します。 csv file

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

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

回答

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つの警告:権限が必要な場合があります。そうでない場合は、メッセージ15281、レベル16、状態1、2行目のSQLServerがSTATEMENT ‘ OpenRowset / OpenDatasource ‘コンポーネント’アドホック分散クエリ’このコンポーネントは、このサーバーのセキュリティ構成の一部としてオフになっているためです。システム管理者は、sp_configureを使用して、’アドホック分散クエリ’の使用を有効にできます。 ‘アドホック分散クエリ’を有効にする方法の詳細については、’アドホックを検索してください。 SQL Server BooksOnlineの分散クエリ’。

回答

ローテクですが…

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

コメント

  • MySQLはを列名として使用し、すべての場所にNULLを出力します。

回答

すでに許容できる解決策があるようですが、データベースメールを設定している場合は次のようなことが起こる可能性があります:

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 

とにかくどこかにファイルを電子メールで送信する場合は、いくつかの手順を節約できる可能性があります。

コメント

  • 私が探していたもの、称賛に値します!
  • デフォルトのプライベートプロファイルがない場合は、@ profile_nameパラメータを追加する必要があります。ユーザーまたはデータベースのパブリックプロファイル用。

回答

これは、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 dbo.LogTableName 

コメント

  • こんにちはドン。私はあなたの答えにいくつかのフォーマットを追加しました。左下の’編集’をクリックして、’を確認できます。変更し、”編集済み” xx分”ビットをクリックして完全な履歴を表示しますロールバックしたい場合。実行可能ですが、あなたの答えは’ ‘がすでに書かれているものをあまり追加せず、あまり注目されないでしょう。

回答

この手順では、渡したクエリの出力をパラメータとして使用して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 

コメント

  • コードのみの回答はここでは受け入れられないと見なされます’回答にコメントを追加して、なぜそれが機能するのですか? (コードコメントはおそらくここでも役立ちます)
  • はい。また、それをうまく使用する方法として例を追加できますか?

回答

MS AccessDoCMDを使用してSQLServerからCSVをエクスポートします。1つのコマンドでエクスポートできます。アクセスデータベースは、アクセスコマンドを有効にするためにのみ使用されます。パフォーマンスが高く、追加の利点として(理由はわかりませんが)、エクスポートされたテーブルのschema.iniが作成されます。

Adam

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" 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です