在SSRS 2005中导出制表符分隔的文件
时间:2020-03-06 14:37:32 来源:igfitidea点击:
在此MSDN文章中,MS解释了如何为SSRS 2005导出的csv类型导出指定除逗号以外的其他定界符,但是,配置文件分析器剥离了文字制表符,并且看来MS没有提供解决方法。
Microsoft Connect上的此项似乎证实了这一点。
有没有人开发出一种从SSRS 2005导出制表符分隔文件的方法?
还是开发了开放源代码的自定义渲染器来完成这项工作?
注意:我听说过通过URL访问手动添加&rc:FieldDelimiter =%09
,但是这对于我的用户来说不是一种可以接受的解决方法,而且似乎也无法正常工作。
解决方案
我使用了选择查询来格式化数据,并使用BCP将数据提取到文件中。就我而言,我将其全部封装在存储过程中,并使用SQL Agent计划在特定时间删除文件。基本编码类似于:
use tempdb go create view vw_bcpMasterSysobjects as select name = '"' + name + '"' , crdate = '"' + convert(varchar(8), crdate, 112) + '"' , crtime = '"' + convert(varchar(8), crdate, 108) + '"' from master..sysobjects go declare @sql varchar(8000) select @sql = 'bcp "select * from tempdb..vw_bcpMasterSysobjects order by crdate desc, crtime desc" queryout c:\bcp\sysobjects.txt -c -t, -T -S' + @@servername exec master..xp_cmdshell @sql
请查看有关使用bcp和存储过程创建csv文件的出色文章。
叫我傻傻先生,但是从存储的proc或者SQL语句返回XML会更简单吗? XSLT向CSV的转换是微不足道的。
或者,我们也可以编写一个同样琐碎的ASP.NET页面,该页面使用ADO.NET获取数据,清除输出流,将mime类型设置为text / csv并将CSV写入其中。
糟糕,我看到我们需要除逗号以外的定界符。但是以上两种解决方案仍然可以应用。如果采用ASP方式,则可能会有一个参数页,让他们选择自己选择的分隔符。
我当前的解决方法是像这样添加自定义CSV扩展名:
<Extension Name="Tabs" Type="Microsoft.ReportingServices.Rendering.CsvRenderer.CsvReport,Microsoft.ReportingServices.CsvRendering"> <OverrideNames> <Name Language="en-US">Tab-delimited (requires patch)</Name> </OverrideNames> <Configuration> <DeviceInfo> <Encoding>ASCII</Encoding> <FieldDelimiter>REPLACE_WITH_TAB</FieldDelimiter> <Extension>txt</Extension> </DeviceInfo> </Configuration> </Extension>
...我们可以看到我使用文本" REPLACE_WITH_TAB"作为字段分隔符,然后使用简单的独立于平台的Perl脚本执行类似于sed的修复程序:
# all .txt files in the working directory @files = <*.txt>; foreach $file (@files) { $old = $file; $new = "$file.temp"; open OLD, "<", $old or die $!; open NEW, ">", $new or die $!; while (my $line = <OLD>) { # SSRS 2005 SP2 can't output tab-delimited files $line =~ s/REPLACE_WITH_TAB/\t/g; print NEW $line; } close OLD or die $!; close NEW or die $!; rename($old, "$old.orig"); rename($new, $old); }
这绝对是一个hack,但是它以一种非侵入性的方式完成了工作。它只需要:
- 在用户计算机上安装的Perl
- 用户将.pl脚本拖到.txt文件目录的能力
- 用户双击.pl脚本的能力
万一有人需要,这对我来说很好用。
<Extension Name="Tabs" Type="Microsoft.ReportingServices.Rendering.DataRenderer.CsvReport,Microsoft.ReportingServices.DataRendering"> <OverrideNames> <Name Language="en-US">Tab-delimited</Name> </OverrideNames> <Configuration> <DeviceInfo> <OutputFormat>TXT</OutputFormat> <Encoding>ASCII</Encoding> <FieldDelimiter>	</FieldDelimiter> <!-- or as this --> <!-- <FieldDelimiter xml:space="preserve">[TAB]</FieldDelimiter> --> <FileExtension>txt</FileExtension> </DeviceInfo> </Configuration> </Extension>