【问题标题】:Convert SSMS .rpt output file to .txt/.csv将 SSMS .rpt 输出文件转换为 .txt/.csv
【发布时间】:2012-05-19 06:30:34
【问题描述】:

我想将我的大型 SSMS (SQL Server Management Studio) 查询结果(2.5m 行,9 个字段)导出为 .csv 或逗号分隔的 .txt(带标题)。 (MS SQL Server 2005 管理工作室。)

这样我就可以将其逐行读入 VBA 程序(对数据进行某些计算)或在 Excel 中对其进行查询(例如使用 Microsoft Query)。计算很复杂,我更喜欢在 SSMS 以外的地方进行计算。

如果我在 SSMS 中选择“查询结果到文本”和一个小答案(几行,例如高达 200k),我当然可以简单地复制并粘贴到文本编辑器中。对于我在这里的大答案,我当然可以一次复制并粘贴 200k 左右的行,10 次,到像 Ultra-Edit 这样的文本编辑器中。 (当我一次尝试所有 2.5m 时,我在 SSMS 中收到内存警告。)但是对于未来,我想要一个更优雅的解决方案。

对于“查询结果到文件”,SSMS 始终写入 .rpt 文件。 (当您在结果窗口中右键单击并选择“另存为”时,会出现如上所示的内存错误。)

--> 所以看起来我唯一的选择是让 SSMS 将其结果输出到一个文件,即 .rpt,然后将 .rpt 转换为 .txt。

我假设这个 .rpt 是一个 Crystal Reports 文件?或者不是。我的电脑上没有 Crystal Reports,所以我不能用它来转换文件。

在 Ultra-Edit 中打开 .rpt 时,它看起来不错。但是在 Excel 中的 Microsoft Query 中,标题不想显示。

当我使用 VBA 简单地读取和写入 .rpt 时,文件大小减半。 (330 至 180 毫克)。在 Microsoft Query 中,现在确实显示了标题(尽管第一个字段名称有一个有趣的前导字符,这在我之前在其他完全不同的情况下发生过)。我似乎确实能够在 Excel 中对其进行有意义的数据透视表。

但是,当我在 Ultra-Edit 中打开这个新文件时,它显示的是汉字!会不会在某个地方还有一些有趣的角色?

--> 是否有免费(简单/安全)的转换器应用程序可用。或者我应该相信这个 .txt 文件可以很好地读入我的 VBA 程序。

谢谢

【问题讨论】:

  • 我想知道为什么你想要输出这么多行,而你只想进一步查询数据?无需输出文本即可使用 Access 或 Excel 和 SQL Server。此外,如果 SQL Server 本身非常擅长查询的话。
  • 嗨,这是因为我想通过程序代码运行数据,这种程序代码的“处理”风格比“查询”风格。换句话说,读取多个输入文件(该文件只是其中一个),执行多个过程/函数,然后写入多个输出文件。我只是使用 VBA,因为我喜欢用于输入运行参数的电子表格界面。我可以用其他编程语言代替它,我的问题也是一样的。
  • 我知道 T-SQL 本身可以很好地执行过程等,我只是更喜欢本质上有点不同的编程语言。附:我现在实际上已经意识到,我可以做的是:代替 SSMS,将 T-SQL 粘贴到 Excel 中并从同一个数据库中执行它,但使用 VBA 代码。然后我可以更轻松地将输出直接写入文本文件(最后)......
  • ...数据透视表等只是对总体数据的性质进行初步检查,然后再对其进行实际的主要运行。
  • (仅针对该线程的新读者... .rpt 扩展名与 Crystal Reports 文件相同只是巧合。这里 SMSS 编写的 .rpt 是这些文件的扩展名文本文件)

标签: sql-server sql-server-2005 character-encoding ssms rpt


【解决方案1】:

简单方法:在 SQL Server Management Studio 中,转到“查询”菜单并选择“查询选项...”>“结果”>“文本”> 将“输出格式”更改为“逗号分隔”。现在,运行查询以导出到文件,完成后将文件从 .rpt 重命名为 .csv,它将在 Excel 中打开:)。

【讨论】:

  • 嗨,谢谢,我后来看到的是 - 使用菜单 > 工具 > 选项 > 查询结果 1. 到文本,以及 2. > 输出格式 > 逗号分隔:A. 没有 SQLCMD,它仍然写得很少Endian,双倍大小,您仍然必须将 unicode 转换为 ASCII。 B. 使用 sqlcmd,它直接写入所需的 ASCII。
  • 这是一个有效的 SQLCMD 示例。放入您的 .sql 脚本中::setvar mypth "F:\work\y temp\SSMS TEST\with sqlcmd\" :out $(mypth)"2 result.txt". 。当然还有第一个:菜单>查询> SQLCMD模式
  • 附言。后者(.sql 脚本中的 SQLCMD)现在是我的首选方法。尽管如此,我使用的大文本文件编辑器仍然提供“unicode to ASCII”选项。但是在执行该选项时,大小保持不变。
  • 请注意,您需要打开一个新的查询选项卡才能使更改生效。
【解决方案2】:

这是我的解决方案。

  • 使用 Microsoft SQL Server Management Studio
  • 将其配置为保存制表符分隔的 .rpt 文件:转到 'Query' > 'Query Options' > 'Results' > ' 文本' > '输出格式'并选择'制表符分隔'(按确定)

  • 现在,当您创建报告时,使用“Save With Encoding...”菜单,然后选择“Unicode”(默认为“UTF8” )

  • 您现在可以使用 Excel 打开文件,所有内容都将在列中,没有转义或外来字符问题(请注意,由于 unicode 编码,文件可能会更大)。

【讨论】:

  • 嗨,谢谢 - 我的文件太大了(例如 2 gig),我必须将它们直接写入硬盘... :)
【解决方案3】:

在朋友的帮助下,我找到了解决方案:Rpt 文件是在 MS SQL Server Management Studio 中生成的纯文本文件,但使用的是 UCS-2 Little Endian 编码而不是 ANSI。

--> 在 Ultra-Edit 中,选项“文件,转换选项,unicode to ASCII”起到了作用。文本文件从 330 兆减少到 180 兆,Excel 中的 Microsoft Query 现在可以看到列,VBA 可以读取文件和进程行*。

附:另一种选择是使用 MS Access(可以处理大结果)并使用 ODBC 连接到数据库。但是,我将不得不使用 Jet-SQL,它的命令比 MS SQL Server Management Studio 的 T-SQL 少。显然,可以在 MS Access 2007 中创建一个新文件为 .adp,然后将 T-SQL 用于 SQL Server 后端。但在 MS Access 2010(在我的 PC 上)中,此选项似乎不再存在。

【讨论】:

  • 附言。在 Notepad++ 中是:菜单 > 编码 > 转换为 ANSI。在 gVim 中,输入:write ++enc=latin1 newfilename.txt(注意文件名前的路径。注意编辑器之后仍会忙于旧文件。)
【解决方案4】:

您可以使用BCP

打开命令提示符,然后键入:

SET Q="select * from user1.dbo.table1"
BCP.EXE %Q% queryout query.out -S ServerName -T -c -t
  • 您可以使用-U -P(而不是-T)进行SQL 身份验证。
  • 您的应用存在 UNICODE 问题。您可以使用-C {code page} 强制代码页。如有疑问,请尝试 850。

  • -t 将强制制表符作为字段分隔符,您可以将其更改为逗号-t,

好消息是您可以直接从您的 VBA 运行 shell 命令中调用它。

【讨论】:

  • 有趣!想玩 cmd 有一段时间了。
  • 对我不起作用,您确定可以将查询作为输入文件传递吗?据我所知,它不受支持,您必须将完整的查询写成字符串。
  • @Yann39:是的,我确定。但是您的查询可能需要稍作修改才能使用。查询结果应该是持久的。尝试 SELECT INTO a #TEMPTABLE 然后 SELECT * FROM #TEMPTABLE 它过去对我有用。
  • @Yann39,你可以运行 C:\>BCP -?获取参数列表
  • @PollusB 你确定你不谈论 sqlcmd 实用程序吗?运行BCP -i join.sql -o test.csv -c -t -S MYSERVER -T 时,我得到“复制方向必须是'in'、'out' 或'format'”。请参阅:stackoverflow.com/questions/10568975/…
【解决方案5】:

这是我认为你可以做到的推荐方式。


My Source(大卫航空的回答)

选择“结果到网格”然后右键单击网格并选择“将结果另存为...”这将保存一个 CSV。

实际上,如果某些值包含逗号,则会出现问题 - 生成的 CSV 未正确转义。 RPT 文件实际上非常好,因为它包含固定宽度的列。如果您有 Excel,将结果转换为 CSV 的相对简单的方法是在 Excel 中打开 RPT 文件。这将打开文本导入向导,Excel 会很好地猜测列。完成向导,然后将结果另存为 CSV。

【讨论】:

  • 感谢 Eon- 这在 SSMS 中产生了内存错误。否则我更喜欢你的方法。问候
  • ...不抱歉,再次测试后:您建议的“网格”选项没有内存错误。但是输出仍然是unicode:(1)'输出到文本',然后右键单击,保存:它只允许保存为.rpt。并且由于发生内存错误,保存未完成。 (2) '输出到网格',然后右键单击,保存:它只允许保存为.csv。 --> 没有内存错误!但是 .csv 仍然是 unicode,就像 .rpt 一样。
  • 我知道这有点旧,但我遇到了这个问题并找到了这个页面。我使用了一种稍微不同的方法。如果您选择整个网格,您可以右键单击并复制标题。然后,您可以将整个网格粘贴到 Excel 中。对我来说似乎是最简单的方法。记住,KISS(保持简单,愚蠢)。
【解决方案6】:

出于以下几个原因,我推荐使用“SQL Server 导入和导出向导”:

  • 输出文件不会像 .rpt 文件那样在底部显示状态消息(即“(受影响的 100 行)”),这可能会扰乱您的数据导入
  • 能够指定长度大于 1 个字符的自定义行和列分隔符
  • 能够指定自定义源到目标的映射(即,列 FirstName 可以映射到 CSV 中的 first_name)
  • 能够直接传输到可从 SSMS 机器访问的任何其他数据库
  • 能够明确选择文件编码和区域设置

可以通过右键单击管理工作室中的数据库(您必须右键单击数据库而不是表)并选择任务 > 导出数据来访问它。

当被要求提供数据源时,您可以选择“SQL Server Native Client”,当被要求选择目标时,您可以选择“平面文件目标”。

然后要求您指定要使用的表或查询。

您可以在此处找到有关该工具的更多信息:

https://docs.microsoft.com/en-us/sql/integration-services/import-export-data/start-the-sql-server-import-and-export-wizard?view=sql-server-2017

【讨论】:

    【解决方案7】:

    在我的情况下,我在 SSMS 上执行查询(在此之前按 CTRL+SHIFT+F)结果打开一个窗口将其保存为 rpt 文件,我无法读取它(我的计算机中没有安装 Crystal Report ) 所以...下次我运行查询时,我将其保存为(所有文件)设置,扩展名为 *.txt,这样我就可以将其作为文本文件读取。

    【讨论】:

    • 谢谢 - 我也是。很巧合的是,.rpt 扩展名与水晶报告文件相同,它实际上只是一个简单的文本文件(尽管编码不同 - 见上文),您可以像以前一样更改扩展名。
    【解决方案8】:

    首先使用上述任何一种方法将您的数据保存在 .rpt 文件中。

    具有固定空间列的默认 .rpt。 (262MB)

    用 Unicode 分隔的逗号。 (52MB) - 我用过这个。

    将文件扩展名更改为 .csv。

    在 excel 中打开/导入并验证数据。文件类型为“文本 Unicode”。

    将其保存为 CSV(逗号分隔),这将大小减小到 25 MB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 2021-05-25
      • 2020-06-14
      • 2019-08-05
      • 2015-06-24
      • 2021-03-30
      • 2014-01-06
      相关资源
      最近更新 更多