2012-05-10 103 views
38

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

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

如果我在SSMS中选择'查询结果到文本'和一个小答案(几行例如高达200k),我当然可以简单地复制并粘贴到文本编辑器。对于我这里的大回答,我当然可以将200k左右的行一次复制并粘贴到Ultra-Edit等文本编辑器中。 (当我一次尝试所有2.5米的时候,我在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程序。

感谢

+2

我不得不想知道,为什么要输出这么多的行,当你想要做的是进一步查询数据?不需要输出文字以与Access或Excel和SQL Server一起使用。另外,SQL Server如果相当擅长查询自己。 – Fionnuala

+1

嗨,这是因为我想通过比“查询”风格更“处理”风格的程序代码运行数据。换句话说,读取多个输入文件(其中这个文件只有一个),执行多个过程/函数,然后写入多个输出文件。我只是使用VBA,因为我喜欢电子表格界面来输入我的运行参数。我可以用其他编程语言来替代它,而我的问题也是一样的。 – Relaxed1

+0

我知道T-SQL可以很好地完成程序本身,我只是更喜欢一种编程语言,它本质上有点不同。 P.s.我现在已经意识到,我可以做的是:而不是SSMS,将T-SQL粘贴到Excel中并从相同的数据库执行它,但是使用VBA代码。然后,我可以更容易地直接将输出写入文本文件(最后)... – Relaxed1

回答

6

好与一个朋友,我发现我的解决方案的帮助:RPT文件是在MS SQL Server Management Studio中生成的纯文本文件,但UCS-2的Little Endian编码,而不是ANSI。

- >在超编辑选项'文件,转换选项,unicode到ASCII'做了伎俩。文本文件从330meg减少到180 meg,Excel中的Microsoft Query现在可以看到列,并且VBA可以读取文件&进程行*。

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

3

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


My Source(回答DavidAir)

选择“结果网格”,然后再对电网右击并选择“保存结果为...”这将节省一个CSV。

实际上,如果某些值包含逗号存在问题 - 生成的CSV未正确转义。 RPT文件实际上相当不错,因为它包含固定宽度的列。如果您有Excel,将结果转换为CSV的一种相对简单的方法是在Excel中打开RPT文件。这将启动文本导入向导,Excel会在猜测列时做得很好。浏览向导,然后将结果保存为CSV。

+1

谢谢Eon-这给了SSMS内部的一个内存错误。否则,我宁愿你的方法。问候 – Relaxed1

+0

...没有对不起,再次测试后:没有内存错误的'网格'选项,你建议。但输出仍然是unicode: (1)'输出到文本',然后右键单击,保存:它只允许保存为.rpt。由于发生内存错误,保存并未完成。 (2)'输出到网格',然后右键单击,保存:它只允许保存为.csv。 - >没有记忆错误!但是.csv仍然是unicode,就像.rpt一样。 – Relaxed1

+0

我知道这有点旧,但我遇到了这个问题,并找到了这个页面。我用了一个稍微不同的方法。 如果您选择整个网格,您可以右键单击并使用标题进行复制。然后,您可以将整个网格粘贴到Excel中。对我来说似乎是最简单的方法。记住,KISS(保持简单,愚蠢)。 – hyperGeoMetric

7

您可以使用BCP(http://msdn.microsoft.com/en-us/library/ms162802.aspx

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

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

  • -t将迫使选项卡,现场delimitor,你可以改变它的逗号-t,

好的是你可以直接从你的VBA运行Shell命令中调用它。

+0

有趣!一直想玩弄cmd一段时间。 – Relaxed1

+0

不适用于我,您确定您可以将查询作为输入文件传递吗?据我所知它不被支持,你必须写完整的查询作为字符串。 – Yann39

+0

@ Yann39:是的,我确定。但是您的查询可能需要一点修改才能处理。查询结果应该是持久的。尝试选择一个#TEMPTABLE,然后选择*从#TEMPTABLE它在过去为我工作。 – PollusB

46

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

+0

嗨,谢谢,我后来看到的是 - 使用菜单>工具>选项>查询结果1.对文本和2.>输出格式>逗号分隔:A.没有SQLCMD,它仍然写入小小的Endian,大小加倍,必须仍然将unicode转换为ASCII。 B.使用sqlcmd,它直接写入所需的ASCII。 – Relaxed1

+0

以下是可用的SQLCMD示例。要放在你的.sql脚本中:':setvar mypth“F:\ work \ y temp \ SSMS TEST \ with sqlcmd \” :out $(mypth)“2 result.txt”。 '。当然也是第一个:菜单>查询> SQLCMD模式 – Relaxed1

+0

P.s.后者(.sql脚本中的SQLCMD)现在是我的首选方法。尽管如此,我使用的大文本文件编辑器仍然给出了一个'unicode to ASCII'选项。但是执行该选项时,大小保持不变。 – Relaxed1

11

这是我的解决方案。

  • 使用Microsoft SQL Server Management Studio中
  • 配置它来保存制表符分隔的.rpt文件:转到 '查询'> '查询选项'> '结果'>“文本 '>' 输出格式 '然后选择' 制表符分隔'(按OK)

enter image description here

  • 现在,当您创建报告,使用“以编码方式保存 '菜单,然后选择' 的Unicode“(默认情况下,它的 'utf-8')

enter image description here

  • 现在,您可以打开的Excel文件,一切都将在列,没有逃脱也没有外来字符问题(请注意,由于unicode编码,文件可能更大)。
+0

嗨,谢谢 - 我的文件虽然很大(例如2演出),但我必须将它们直接写入硬盘驱动器... :) – Relaxed1

0

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

+0

谢谢 - 是的,我也是。简单的巧合是.rpt扩展名与水晶报表文件相同,实际上它只是一个简单的文本文件(尽管编码不同 - 参见上文),您可以像修改扩展名一样更改扩展名。 – Relaxed1