SQL Server:SSMS“將結果另存為”創建 Excel 破壞的 CSV
使用將結果另存為選項,如下所示。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 ALL
ed 查詢(使它們成為子查詢),所以我可以只選擇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 輸出就如預期的那樣。這是讓我正確移動的連結。