【问题标题】:Exporting tab-delimited files in SSRS 2005在 SSRS 2005 中导出制表符分隔的文件
【发布时间】:2010-09-12 12:38:55
【问题描述】:

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

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

【问题讨论】:

    标签: csv reporting-services reportingservices-2005


    【解决方案1】:

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

    <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>
    

    【讨论】:

    • 在 SSRS 2008 R2 中效果很好,顺便说一句。
    • 文件位置是 C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\rsreportserver.config。这在 元素下。
    【解决方案2】:

    我使用选择查询来格式化数据并使用 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
    

    请查看creating-csv-files-using-bcp-and-stored-procedures 的精彩帖子。

    【讨论】:

    • xp_cmdshell 必须以管理权限运行。对于生产环境,这不是一个好的答案。
    【解决方案3】:

    我目前的解决方法是添加一个自定义 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 脚本的能力

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-22
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 2016-01-17
        相关资源
        最近更新 更多