web-dev-qa-db-ja.com

SQL Server Management Studioで「実際の」CSV形式でエクスポート出力を取得する方法

SQL Server Management Studio(SQL Server 2005データベースに接続)で実行しているクエリがあります。データをCSV形式でエクスポートしたい。各列の間にカンマを挿入するだけのCSV形式ではなく、文字列を引用符で囲む「実際の」CSV形式です。これにより、カンマまたは引用符が含まれるデータをエクスポートできます。

私が見るすべての例は、自分自身を望んでいる形式に限定しています。文字列を引用するオプションがどこにあるのかわかりません。

SSMSが本当にこの基本的な偉業を達成できない場合、それを簡単に行う他のツールはありますか?データダンプが必要になるたびにC#プログラムを作成する必要はありません。

65
Peter Recore

SSMS 2012には、このオプションがあります。[ツール]-> [オプション]-> [クエリ結果]-> [SQL Server]-> [グリッドへの結果]は、「。csv結果の保存時にリストセパレーターを含む文字列を引用」と呼ばれます。このようなオプションがどれくらいの期間存在していたかはわかりませんが、2つのことに困惑しています。

  1. デフォルトでオンになっていないのはなぜですか
  2. コードをエクスポートするCSVの本質的な部分ではなく、オプションである理由

デフォルトの動作では、適切にインポートできないCSVエクスポートを使用するという信念に反します。 Excelが同じことをしていることに気付いたので、オプションもあるかどうかを確認する必要があります。

それまでの間、CSVエクスポーターが完全に役に立たないことを暴言していたときに、この奇妙な機能を指摘してくれた同僚に感謝します。これは私が見つけた最高のリンクでしたので、将来の検索者のためにここにある知識。

更新

以下のスクリーンショット: enter image description here

113
Matthew Walton

私の通常の回避策は、クエリに組み込むことです:

SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...

それをユーザー定義関数に組み込み、少し簡単にすることができますが、データ型ごとに個別の関数を構築する必要があります。

11
Joel Coehoorn

これらの設定のさまざまな組み合わせにより、誤ったデータまたは部分的なデータの結果が出力される可能性があります。これは、Microsoftがこれらの問題を修正するのに十分重要だとは考えていなかったためです。結果をファイルに送信するときに、CSVファイルで何が起こるかを説明しているだけです。

良好な結果を得るには、以下を実行します:

新しいクエリウィンドウを開く(新しいタブ/セッション)...しない場合、以下の設定は失われ、デフォルトに戻されます

引用内の引用を処理するクエリを作成し、すべての文字列データ型を引用で囲みます。また、異なるDBMSおよびプログラミング言語の文法は、エスケープされた二重引用符に対して異なる構文を受け入れることに注意してください(この出力を別のシステムへの入力として使用する場合)。一部は\"を使用します。一部は""を使用します。 XMLは"を使用します。おそらくMicrosoftがこの機能を無視することを選んだ理由は、彼らが議論に対処する必要がなかったからです。

..新しいシステムのエスケープシーケンスが""の場合。

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1

..新しいシステムのエスケープシーケンスが\"の場合。

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1

構成:

[クエリオプション]> [結果]> [結果のコピーまたは保存時に列ヘッダーを含める]チェックボックス

クエリオプション>結果>「.csv結果の保存時にリスト区切り文字を含む引用文字列」-壊れた;使用しないでください!

クエリオプション>結果>その他のチェックなし

クエリオプション>結果>テキスト>カンマ区切り(右上隅に設定)

[クエリオプション]> [結果]> [テキスト]> [結果セットに列ヘッダーを含める]チェックボックス

クエリオプション>結果>テキスト>その他のチェックなし

[クエリオプション]> [結果]> [テキスト]> [各列に表示される最大文字数]-文字列が切り捨てられないように最大長に設定します。

Query> Results To File(これは3つのオプションすべての切り替えです)

クエリの実行(F5)

レポートのファイル名のプロンプト

ファイルを開いて結果を見る

注:定期的にこれを行う必要がある場合は、.NETまたはJava、または使いやすい言語でこれを行うプログラムを開発することをお勧めします。そうしないと、間違いを犯す可能性が高くなります。次に、SQL Serverからのエクスポートを定義する前に、インポート先のシステムの構文に十分注意してください。

7
MacGyver

PowerShell経由でSSMSからCSVにエクスポートする についてどう思いますか?この投稿では、現在選択されているクエリをCSVにエクスポートするPowerShellスクリプトに送信するSSMSの外部ツールを定義する方法について説明します。

4
billinkc

オプションが混乱した状態で利用可能ですが、完全に機能するわけではありません。以下は少なくとも機能しています。

  1. DBコンテキストメニューから[タスク]> [データのエクスポート]を選択します(テーブルレベルでも機能しません)
  2. [ソース]で、[Microsoft OLE SQL Server用DBプロバイダー]を選択します。
  3. 宛先として「フラットファイル...」を選択し、「フォーマット」を区切り記号で指定し、text qualifier二重引用符として
  4. テーブルまたはクエリを選択します(クエリで作業しました)
  5. ウィザードを終了する

あなたは行ってもいいはずです!

3
netandwhich

SSMSだけでこれを行う方法はありません。 TOAD(http://www.toadworld.com/)にはCSVオプションがあることを知っています。エスケープ形式かどうかはわかりません。 SSISがオプションの場合、文字列をエスケープする形式(真のCSV)に変換できますが、SSMSにはありません。

C#プログラムを作成する必要がある場合は、テーブルをクエリしてからクエリを実行することを検討してください。

1

上記のすべての設定では、SSMS(SQL Server 2014)で生成されたCSVが修正されず、タブ区切りファイルをエクスポートしても改善されなかったため、同僚と私はSSMSを変換するコンバータースクリプト(Ruby)を作成しましたCSVから読み取り可能なCSVへ。元のファイルのエンコード、区切り文字、改行を保持し、最後に完全なバイト一致の検証も行います(解析された(!)入力ファイルからSSMS形式のファイルを作成し、両方のファイルを比較します)。

https://Gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88

エラーが発生した場合は、githubでご連絡ください。乾杯!

1
Niklas B.

アプリケーションでは機能しないかもしれませんが、通常はタブ区切り形式にエクスポートすることでこの問題を回避できます。この単純なソリューションが当てはまる場合は、見逃さないでください。

1
Brian Wirt

通常、私はこの種の機能を使用します:

CREATE FUNCTION [dbo].[toExport]
(
    @txt varchar(max)

)
RETURNS varchar(max)
AS
BEGIN

    return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' ');

END

そして、選択してここに入れます:

SELECT dbo.toExport( column_name ) AS column_name FROM ....

また、SMSS 2012では、単にグリッドを右クリックして結果を保存するか、すべてのグリッド(ctrl-A)とctrl-VをExcelにコピーします。

MS Excelなどの列で問題なくデータを管理する最も簡単な方法です。

もちろん、[ツール]-> [オプション]-> [クエリ結果]-> [SQL Server]-> [グリッドへの結果]で[.csv結果を保存するときにリストセパレーターを含む文字列を引用]をクリックする必要があります。

1
Maciej Niemir

最も簡単なのは、SSMSエクスポートを使用するのではなく、Excelを開いてSQL接続からデータをインポートすることだと思います。おそらくそれが機能しないため

ロン

0
ron