Sql-Server

SQL Server:SSMS“將結果另存為”創建 Excel 破壞的 CSV

  • January 2, 2020

使用將結果另存為選項,如下所示。CSV 看起來不錯!

但是當 Excel 打開/導入它時:

  • 長字元串被破壞為數字(如果數據主要是數字)
  • 未正確檢測日期
  • 我的使用者對這一切都很不滿

如何在不跳舞的情況下查詢乾淨的 excel 文件(真正的 xls/xlsx)?(我們喜歡 SQL 文件本身中的所有內容……我希望我們可以執行“SELECT INTO FILE:C:\SQLOUTPUT\DATA.XLS …”)

在此處輸入圖像描述

首先,確保您已按照您想要的方式設置了查詢選項。

轉到查詢菜單,然後選擇查詢選項:

查詢選項對話框

兩個突出顯示的選項中的第一個告訴 SSMS 在您的 CSV 文件中包含列標題。第二個告訴 SSMS 在包含逗號的列周圍加上單引號。

我懷疑你已經這樣做了,但我認為為了完整性我應該提到它。

如果這不足以將您的數據轉換為 Excel 將正確解釋的格式,我的下一步可能是(如評論中所述)使用導入/導出嚮導生成執行此操作的 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),並使用創建標題行UNION ALL的 a 進行編輯。SELECT然後我包裝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
;

你可以在這裡看到這個執行。

注意:如果您手動格式化 CSV,您可能希望關閉上述兩個複選框。

我在欄位上遇到了同樣的問題,並且限制輸出的長度根本沒有幫助,因為它與輸入有關。

在執行要輸出到 Excel 的數據之前,請更改對這些自由文本欄位的查詢以處理這些返回:

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

一旦我這樣做了,Excel 輸出就如預期的那樣。這是讓我正確移動的連結。

引用自:https://dba.stackexchange.com/questions/190898