在this MSDN article中,MS解释了如何为SSRS 2005中的csv-type导出指定除逗号之外的其他分隔符,但是,文本制表符被配置文件解析器剥离,并且MS看起来没有提供了一种解决方法
Microsoft Connect上的This entry似乎证实了这一点
有没有人开发出一种从SSRS 2005导出制表符分隔文件的方法?
或者也许开发了一个开源的自定义渲染器来完成工作?
注意:我听说过通过网址访问手动添加&rc:FieldDelimiter=%09
,但这对我的用户来说不是一种可接受的解决方法,但似乎无法正常工作。
答案 0 :(得分:2)
如果有人需要,这对我来说非常好。
<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>
答案 1 :(得分:1)
我使用select查询格式化数据,使用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
答案 2 :(得分:1)
我当前的解决方法是添加自定义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的修复:< / p>
# 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);
}
这绝对是一个黑客,但它以相当非侵入性的方式完成工作。它只需要:
答案 3 :(得分:0)
叫我Silly先生,但是从存储过程或SQL语句返回XML会不会更简单?对CSV进行XSLT转换是微不足道的。
或者您可以编写一个同样简单的ASP.NET页面,使用ADO.NET获取数据,清除输出流,将mime类型设置为text / csv并将CSV写入其中。
糟糕,我发现你想要一个分隔符其他而不是逗号。但是仍然可以应用上述两种解决方案。如果你采用ASP方式,你可以有一个参数页面,让他们选择他们选择的分隔符。