SQL Server:SSMS“将结果另存为”创建 Excel 破坏的 CSV

Jon*_*ica 3 sql-server export ssms excel

使用“结果另存为”选项,如下所示。CSV 看起来不错!

但是当 Excel 打开/导入它时:

  • 长字符串被破坏为数字(如果数据主要是数字)
  • 未正确检测日期
  • 我的用户对这一切感到不满

如何在不跳舞的情况下查询干净的 Excel 文件(真正的 xls/xlsx)?(我们喜欢 SQL 文件本身中的所有内容...我希望我们可以执行“SELECT INTO FILE:C:\SQLOUTPUT\DATA.XLS ...”)

在此输入图像描述

RDF*_*ozz 5

首先,确保您已按照您想要的方式设置查询选项。

转到查询菜单,然后选择查询选项:

查询选项对话框

两个突出显示的选项中的第一个告诉 SSMS 在 CSV 文件中包含列标题。第二个告诉 SSMS 在包含逗号的列两边加上单引号。

我怀疑您已经完成了此操作,但为了完整起见,我认为我应该提及它。

如果这不足以将数据转换为 Excel 能够正确解释的格式,我的下一步可能是(如评论中所述)使用导入/导出向导生成执行此操作的 SSIS 包。但是,向导并不总是能正确引用 - 特别是,它可以将内容放在双引号中,但不会“加倍”嵌入在字符串中的双引号。

通常在这一点上,我会诉诸暴力。

我创建了一个修改后的查询:

  • 将数据 ( ") 中的双引号替换为双双引号 ( "");
  • 将数字/日期值转换为字符串,以及
  • 将所有数据放入双引号中,并且(最后)
  • 输出所有连接在一起的列,并用逗号分隔。

所以,而不是

 ID | First Name | Last Name |      Address      
----+------------+-----------+-------------------
  1 |  John "JT" |   Smith   |  123 Wayne's Way  
Run Code Online (Sandbox Code Playgroud)

我生成:

One_Big_Column
------------------------------------------------
"1","John ""JT""","Smith","123 Wayne's Way"
Run Code Online (Sandbox Code Playgroud)

如果我要定期使用该查询,它将包含一sortOrder列(设置为 1),并使用创建标题行的UNION ALLa 进行编辑。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
;
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看此运行。

注意:如果您手动格式化 CSV,您可能需要关闭上述两个复选框。