Экспорт файлов с разделителями табуляцией в SSRS 2005

В этой статье MSDN MS объясняет, как чтобы указать другие разделители, кроме запятых, для экспорта в формате csv из SSRS 2005, однако литеральные символы табуляции удаляются синтаксическим анализатором файла конфигурации, и похоже, что MS не предоставила обходной путь.
Эта запись в Microsoft Connect подтверждает это.
Кто-нибудь разработал способ экспортировать файлы с разделителями табуляцией из SSRS 2005?
Или, может быть, для выполнения этой работы разработали пользовательский модуль визуализации с открытым исходным кодом?

Примечание. Я слышал о ручном добавлении &rc:FieldDelimiter=%09 через URL-адрес, но это неприемлемый обходной путь для моих пользователей, и в любом случае он не работает.


person jimmyorr    schedule 23.09.2008    source источник


Ответы (4)


В случае, если это кому-то нужно, это работает очень хорошо для меня.

<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>
person Community    schedule 20.08.2009
comment
Отлично работает в SSRS 2008 R2, кстати. - person Jordan; 22.12.2011
comment
Расположение файла: C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\rsreportserver.config. Это относится к элементу ‹Render›. - person Jersey Dude; 02.04.2013

Я использовал запрос выбора для форматирования данных и 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

Пожалуйста, взгляните на отличный пост создание-CSV-файлов-с-использованием-bcp-и-хранимых-процедур.

person Leo Moore    schedule 23.09.2008
comment
xp_cmdshell должен запускаться с правами администратора. Это не лучший ответ для производственной среды. - person Peter Wone; 28.09.2008

Мой текущий обходной путь заключается в добавлении пользовательского расширения 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);
}

Это определенно взлом, но он выполняет свою работу довольно неинвазивным образом. Требуется только:

  • Perl установлен на машине пользователя
  • Возможность пользователя перетаскивать скрипт .pl в каталог файлов .txt
  • Возможность пользователя дважды щелкнуть сценарий .pl
person jimmyorr    schedule 26.09.2008

Зовите меня мистер Глупый, но не проще ли было бы вернуть XML из хранимой процедуры или оператора SQL? Преобразование XSLT в CSV тривиально.

Или вы можете написать столь же тривиальную страницу ASP.NET, которая получает данные с помощью ADO.NET, очищает поток вывода, устанавливает тип mime в text/csv и записывает в него CSV.

К сожалению, я вижу, вам нужен разделитель отличный от запятой. Но оба вышеупомянутых решения все еще могут быть применены. Если вы пойдете по пути ASP, у вас может быть страница параметров, которая позволяет им выбирать разделитель по своему выбору.

person Peter Wone    schedule 24.09.2008