2

这篇 MSDN 文章中,MS 解释了如何为 SSRS 2005 的 csv 类型导出指定除逗号之外的其他分隔符,但是,配置文件解析器会去除文字制表符,而且 MS 似乎没有提供解决方法。
Microsoft Connect 上的此条目似乎证实了这一点。
有没有人开发了一种从 SSRS 2005 导出制表符分隔文件的方法?
或者也许开发了一个开源自定义渲染器来完成工作?

注意:我听说过&rc:FieldDelimiter=%09通过 URL 访问手动附加,但这对我的用户来说不是可接受的解决方法,而且似乎也不起作用。

4

4 回答 4

3

如果有人需要它,这对我来说效果很好。

<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>&#9;</FieldDelimiter>
      <!-- or as this -->
      <!-- <FieldDelimiter xml:space="preserve">[TAB]</FieldDelimiter> -->
      <FileExtension>txt</FileExtension>
    </DeviceInfo>
  </Configuration>
</Extension>
于 2009-08-20T19:57:26.787 回答
1

我使用选择查询来格式化数据并使用 BCP 将数据提取到文件中。在我的例子中,我将它全部封装在一个存储过程中,并使用 SQL 代理安排它在特定时间删除文件。基本编码类似于:

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

请查看出色的帖子created-csv-files-using-bcp-and-stored-procedures

于 2008-09-23T23:21:27.027 回答
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 的修复:

# 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 脚本的能力
于 2008-09-26T16:27:35.940 回答
0

叫我傻先生,但从存储过程或 SQL 语句返回 XML 不是更简单吗?XSLT 到 CSV 的转换是微不足道的。

或者您可以编写一个同样简单的 ASP.NET 页面,该页面使用 ADO.NET 获取数据,清除输出流,将 mime 类型设置为 text/csv 并将 CSV 写入其中。

糟糕,我看到您想要逗号以外的分隔。但是上述两种解决方案仍然可以应用。如果您采用 ASP 方式,您可以有一个参数页面,让他们选择他们选择的分隔符。

于 2008-09-24T03:23:11.237 回答