将SSMS .rpt输出文件转换为.txt/.csv

65
我希望将SSMS(SQL Server Management Studio)查询结果(2.5m行,9个字段)导出为 .csv 或逗号分隔的 .txt(包括列标题)。这样我就可以逐行读入VBA程序(对数据进行某些计算),或在 Excel 中进行查询(例如使用 Microsoft Query)。由于计算较复杂,我更喜欢在其他地方进行操作而非在 SSMS 中。如果我在 SSMS 中选择“查询结果到文本”,并且是小型答案(几行,例如不超过 200k),那么当然可以直接复制粘贴到文本编辑器中。对于如此庞大的答案,我可以每次复制粘贴 20 万行左右,共十次,到诸如 Ultra-Edit 之类的文本编辑器中。(当我尝试一次性复制全部的 2.5m 行时,在 SSMS 中会收到内存警告。)但是,未来我想要一个更优雅的解决方案。对于“查询结果到文件”,SSMS 总是写入 .rpt 文件。(当您在结果窗格中右键单击并选择“另存为”时,它会像上述情况一样给出内存错误。)--> 所以看起来我的唯一选择是让 SSMS 输出其结果到文件,即 .rpt,然后转换为 .txt。我假设这个 .rpt 是一个 Crystal Reports 文件?还是说不是呢?我没有 Crystal Reports,所以不能使用它来转换文件。在 Ultra-Edit 中打开 .rpt 看起来很好。然而,在 Excel 的 Microsoft Query 中,标题却无法显示。当我仅使用 VBA 读取并写入 .rpt 文件时,文件大小减少了一半。(330meg 变为 180meg)。在 Excel 的 Microsoft Query 中现在列标题确实显示出来了(尽管第一个字段名称有一个有趣的前导字符,在其他完全不同的情况下也曾发生过这种情况)。我似乎能够在 Excel 中进行有意义的数据透视表操作。

然而,当我在Ultra-Edit中打开这个新文件时,它显示出了中文字符!可能还有一些奇怪的字符存在吗?

--> 也许有一个免费(且简单/安全)的转换应用程序可供使用。或者我应该相信这个 .txt 文件对于读入我的 VBA 程序来说是可以的。

谢谢。


3
当你只想进一步查询数据时,我不禁要想知道为什么你要输出这么多行?在使用Access、Excel和SQL Server时,没有必要输出文本。此外,SQL Server本身就很擅长查询。 - Fionnuala
1
嗨,这是因为我想通过程序代码来运行数据,这种风格更偏向于“处理”而不是“查询”。换句话说,读取多个输入文件(其中此文件只是其中之一),执行多个过程/函数,然后编写多个输出文件。我只是使用VBA,因为我喜欢电子表格界面来输入我的运行参数。如果我用其他编程语言替代它,我的问题也会是一样的。 - Relaxed1
我知道T-SQL可以很好地处理存储过程等,但我更喜欢一种在本质上有些不同的编程语言。顺便说一句,我现在意识到,我可以将T-SQL粘贴到Excel中,并使用VBA代码从同一个数据库执行它。然后我可以更轻松地将输出直接写入文本文件(最终)。 - Relaxed1
透视表等只是为了在实际运行之前对数据的性质进行初步检查。 - Relaxed1
1
(仅适用于本帖新读者...这只是巧合,.rpt扩展名与Crystal Reports文件相同。SMSS编写的.rpt是这些文本文件的自己的扩展名) - Relaxed1
如果您只需要加载 .rpt 文件而不是弄清如何导出为 .csv,这里是步骤:https://dev59.com/ofX1s4cB2Jgan1znaeuu#56188149 - GregGalloway
8个回答

82

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


嗨,谢谢。我后来发现的是——通过菜单 > 工具 > 选项 > 查询结果 1. 到文本,以及 2. > 输出格式 > 逗号分隔:A. 没有 SQLCMD,它仍然写入小端,大小加倍,你仍然需要将 Unicode 转换为 ASCII。B. 使用 sqlcmd,它直接写入所需的 ASCII。 - Relaxed1
这是一个可行的SQLCMD示例,应放置在您的.sql脚本中: :setvar mypth "F:\work\y temp\SSMS TEST\with sqlcmd\" :out $(mypth)"2 result.txt". 。当然,首先还需要选择菜单 > 查询 > SQLCMD模式。 - Relaxed1
附言:现在我更喜欢使用 .sql 脚本中的 SQLCMD。即使如此,我使用的大文本文件编辑器仍然提供“Unicode 到 ASCII”的选项。但是在执行该选项时,文件大小仍然保持不变。 - Relaxed1
2
请注意,您需要打开一个新的查询选项卡才能使更改生效。 - Sal

25

这是我的解决方案。

  • 使用Microsoft SQL Server Management Studio
  • 将其配置为保存Tab分隔的.rpt文件:转到 '查询' > '查询选项' > '结果' > '文本' > '输出格式',然后选择 'Tab分隔'(按下OK)

enter image description here

  • 现在,在创建报告时,使用 '另存为编码...' 菜单,并选择 'Unicode'(默认情况下,它是 'UTF8')

enter image description here

  • 现在,您可以使用Excel打开文件,所有内容都将以列形式呈现,没有转义或非本地字符问题(请注意,由于unicode编码,文件可能会变大)。

1
嗨,谢谢 - 我的文件非常大(例如2GB),我必须直接将它们写入硬盘... :) - Relaxed1

9

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

我在文本编辑器中打开导出的文件并从Unicode转换为ASCII。文本文件从330兆减少到180兆,Excel中的Microsoft Query现在可以看到列,并且VBA可以读取文件并处理行*。

P.s.另一种选择是使用MS Access(可以处理大结果集)并使用ODBC连接到数据库。但是,那样我就必须使用Jet-SQL,它比MS SQL Server Management Studio的T-SQL命令更少。显然,可以在MS Access 2007中创建一个新文件作为.adp,然后使用T-SQL连接到SQL Server后端。但是,在我的PC上的MS Access 2010中,似乎不存在这个选项。


1
在Notepad++中,它是:菜单>编码>转换为ANSI。在gVim中,输入:write ++enc=latin1 newfilename.txt(注意文件名前的路径。并且请注意编辑器之后仍将忙于旧文件)。 - Relaxed1

8
你可以使用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,

好处在于,您可以直接从运行shell命令的VBA中调用它。


对我来说不起作用,你确定可以将查询作为输入文件传递吗?据我所知,这是不支持的,你必须将完整的查询作为字符串编写。 - Yann39
@Yann39:是的,我确定。但是你的查询可能需要一些修改才能与此配合使用。查询结果应该是持久的。尝试将其SELECT INTO到一个#TEMPTABLE中,然后SELECT * FROM #TEMPTABLE,在过去这对我有用。 - PollusB
@Yann39,你可以运行C:>BCP -? 来获取参数列表。 - PollusB
1
@PollusB 你确定你不是在说 sqlcmd 实用程序吗?当我运行 BCP -i join.sql -o test.csv -c -t -S MYSERVER -T 时,会出现 "Copy direction must be either 'in', 'out' or 'format'" 的错误提示。参考:https://dev59.com/IWkv5IYBdhLWcg3wewxd - Yann39
@daveloyall,我已经编辑了我的答案,所以命令可以正常工作。这种方法仍然是回答问题的有效方法。 - PollusB
显示剩余4条评论

4

这是我认为你可以实现的推荐方式。


我的来源(DavidAir的答案)

选择“结果输出到网格”,然后右键点击网格并选择“另存为结果...”这将保存为CSV文件。

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


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

2
我建议使用“SQL Server 导入和导出向导”,原因如下:
  • 输出文件不会像 .rpt 文件一样在底部显示状态信息(例如“(100 行受影响)”),这可能会破坏您的数据导入。
  • 能够指定大于 1 个字符的自定义行和列分隔符。
  • 能够指定自定义源到目标映射(例如,将列 FirstName 映射到 CSV 中的 first_name)。
  • 能够直接传输到任何其他从 SSMS 机器可访问的数据库。
  • 能够明确选择文件编码和区域设置。
您可以通过在管理工作室中右键单击数据库(必须右键单击数据库而不是表),然后选择“任务”>“导出数据”来访问它。

Selecting the data export tool from the SSMS object explorer

当被要求提供数据源时,您可以选择“SQL Server Native Client”,当被要求选择目标时,您可以选择“平面文件目标”。
然后会要求您指定要使用的表格或查询。
您可以在此处找到有关该工具的更多信息:

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


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

谢谢 - 我也是。 .rpt扩展名与Crystal Reports文件相同只是一个简单的巧合,它实际上只是一个简单的文本文件(尽管具有不同的编码 - 请参见上文),您可以像您所做的那样更改扩展名。 - Relaxed1

0

首先使用以上任何一种方法将数据导入.rpt文件。

默认情况下,.rpt文件具有固定的列间距。(262MB)

逗号分隔符带Unicode。(52MB) - 我使用了这个。

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

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

将其另存为 CSV(逗号分隔),可以将文件大小减小到25 MB


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接