web-dev-qa-db-ja.com

SQL Server:SSMSの「名前を付けて結果を保存」は、Excelが変換するCSVを作成します

以下に示す「結果を名前を付けて保存」オプションの使用。 CSVは良さそうです。

しかしExcelがそれを開く/インポートするとき:

  • 長い文字列は数値として符号化されます(データの大部分が数値の場合)
  • 日付が正しく検出されない
  • 私のユーザーはこのすべてについて牛肉

ダンスなしでクリーンなExcelファイル(実際のxls/xlsx)へのクエリを取得するにはどうすればよいですか? (実際にはSQLファイル自体にすべてを入れたいのですが、 "SELECT INTO FILE:C:\ SQLOUTPUT\DATA.XLS ..."を実行できたらと思います)

enter image description here

ダンスなしで機能する唯一の本当の答えは、SSISを使用することです。

単純なSQLが好きなので、SSISを避けたかったのです。単純なSQLは次のとおりです。

  • テストが簡単
  • バージョン管理が簡単
  • sQLエージェントジョブを簡単に投入
  • sQLの結果をメールで簡単に取得

私は5分から20分ですべてを行うことができ、完了します。複数のSQL Serverに簡単に複製することもできます。

私は SQL# を使用したかったのですが(長い間、それを使用する言い訳を望んでいました!)ネイティブのExcelエクスポート機能がなく、今日はいくつかの火事と戦わなければならないので、気まずいことができません。それを学ぶ。

SSISやSQLエージェントなどのように断片をチェーンでつなぐ必要がある場合、1時間以上のいじくり回しであり、SQLサーバーを移動するとすべてがバラバラになります(これは16〜24か月ごとに行います)。駒が悪い。

しかし、私はこれのためにw個をスタックしています。

残念。 SQL Serverはメタレベルで強力になると思います。

まず、クエリオプションが希望どおりに設定されていることを確認します。

[クエリ]メニューに移動し、[クエリオプション]を選択します。

Query Options dialog

強調表示された2つのオプションのうち最初のオプションは、CSVファイルに列ヘッダーを含めるようにSSMSに指示します。 2番目は、コンマを含む列を単一引用符で囲むようにSSMSに指示します。

あなたはすでにこれを行っているのではないかと思いますが、完全を期すために私はそれについて言及する必要があると思いました。

データがExcelで正しく解釈される形式に変換するのにこれが十分でない場合、次の手順は(コメントに記載されているように)インポート/エクスポートWizardを使用してSSISを生成することですただし、ウィザードは常に正しい引用符を取得するとは限りません。特に、二重引用符で囲むことができますが、文字列に埋め込まれた二重引用符を「二重に」することはできません。

一般に、その時点で、私は力ずくで訴えます。

次のような変更されたクエリを作成します。

  • データ内の二重引用符(")を二重二重引用符("")に置き換えます。
  • 数値/日付値を文字列に変換し、
  • すべてのデータを二重引用符で囲み、(最終的に)
  • すべての列をコンマで区切って連結して出力​​します。

したがって、代わりに

 ID | First Name | Last Name |      Address      
----+------------+-----------+-------------------
  1 |  John "JT" |   Smith   |  123 Wayne's Way  

私は生成します:

One_Big_Column
------------------------------------------------
"1","John ""JT""","Smith","123 Wayne's Way"

クエリを定期的に使用する場合、sortOrder列(1に設定)が含まれ、ヘッダー行を作成するSELECTUNION ALLedされます。次に、UNION ALLedクエリをラップして(サブクエリにして)、One_Big_Columnだけを選択して、sortOrderで並べ替えることができます。

SELECT One_Big_Column
  FROM (
        SELECT '"Id","First Name","Last Name","Address"' as One_Big_Column
              ,0 as sortOrder
        UNION ALL
        SELECT '"' + CAST(Id as varchar(30)) + '","'
                    + REPLACE(firstname, '"','""') + '","'
                    + REPLACE(lastname, '"','""') + '","'
                    + REPLACE(address, '"','""') + '"'
              ,1 AS sortOrder
          FROM myTable
       ) sq
 ORDER BY sortOrder
;

この実行 here を確認できます。

注:CSVを手動でフォーマットする場合は、上記の両方のチェックボックスをオフにすることをお勧めします。

4
RDFozz

フィールドで同じ問題が発生し、キャリッジリターンに関係しているため、出力の長さを制限してもまったく効果がありませんでした。

Excelに出力するデータを実行する前に、これらのフリーテキストフィールドのクエリを変更して、それらの戻り値を処理します。

SELECT REPLACE(REPLACE(Description, CHAR(10), ''), CHAR(13), ''), ...

一度実行すると、Excelの出力は期待どおりでした。 これ は、私を正しく動かすためのリンクです。

2
Briana Finney

これは、SQL Serverの障害でも、SSMSの障害でもありません。

Excelは設計上、誤った方法でCSVを開く可能性があります。これは、長年にわたってよく知られている問題です。同じExcelで正しく開かないExcelからCSVファイルを簡単にエクスポートすることもできます。

CSVとExcelでの唯一の解決策は、ファイルをダブルクリックしないか、Excel内からOpenコマンドを使用することです(そうしないと、独自に決定して破壊する)代わりに、空のワークシートを開いて使用します- インポート->インポートテキストから。これで、すべての異なる列を管理する方法を伝えることができます。

0
motoDrizzt