如何在输出文件的不同行中获取SSRS报告数据的各个部分

问题描述 投票:0回答:1

我在SSMS中有一个存储过程,看起来像这样:

SELECT
    1 AS [Transaction Type 1]
    ,SOMEFIELD AS [Some Field]
    ,ANOTHERFIELD AS [Another Field]
    ,...

    ,2 AS [Transaction Type 2]
    ,SOMEOTHERFIELD AS [Some Other Field]
    ,YETANOTHERFIELD AS [Yet Another Field]
    ,...

    ,4 AS [Transaction Type 4]
    ,MOREFIELDS AS [More FieldS]
    ,EVENMOREFIELDS AS [Even More Fields]
FROM SomeTable
JOINS
WHERE
ORDER BY

客户要求,对于输出中的每个记录,每个“交易类型”部分(1,2,4)都必须在运行报告时SSRS生成的文件中的一行上。他们正在处理SSRS生成的输出文件中的数据,因此他们不关心报告运行时报告在浏览器中的外观,但是文件应该看起来像这样:

1|10354|99999-9999|O|SOMENAME|11161947|M|999-99-9999|SOMEADDRESS|SOMEADDRESS|SOMECITY|ST|99999|999-999-9999|CLI|99999999|99999999|O|S|
2|10354|99999-9999|O||||||||MSOMENAME|U61434|1790702207|465|||PODSTTRY|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4|117245592|SOMECOMPANY|STDSNP|117245592|1|Self
1|10723|99999-9999|O|SOMENAME|08081934|M|999-99-9999|SOMEADDRESS||SOMECITY|ST|99999|999-999-9999|ER |99999999|99999999|O|M|
2|10723|99999-9999|O||||||||SOMENAME||1356982441|3119||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4|4VH2R42VX92|SOMECOMPANY||4VH2R42VX92|1|Self
1|12318|99999-9999||SOMENAME|07201973|F|999-99-9999|SOMEADDRESS||SOMECITY|ST|99999|999-999-9999|CLI|99999999|99999999|O|M|
2|12318|99999-9999|||||||||SOMENAME||1194703439|1639||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4|STLW01260703|SOMECOMPANY|36650|STLW01260703|1|Self

如上所述,在文件输出中,每个1、2和4类型部分均位于其单独的行上。但是,出于此问题的目的,我不得不手动执行上述文件输出示例,因为实际的文件输出如下所示:

1|12318|99999-9999||SOMENAME|99999999|F|999-99-9999|SOMEADDRESS||SOMECITY|ST|99999|999-999-9999|CLI|99999999|99999999|O|M|2|12318|99999-9999|||||||||SOMENAME||99999999|1639||G68462||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||4|STLW01260703|SOMECOMPANY|36650|STLW01260703|1|Self
1|12328|99999-9999|O|SOMENAME|99999999|M|999-99-9999|SOMEADDRESS||SOMECITY|ST|99999|999-999-9999|CLI|99999999|99999999|O|S|2|12328|99999-9999|O||||||||SOMENAME||99999999|2447||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||4|CPWW01093606|SOMECOMPANY|20041|CPWW01093606|1|Self
1|12508|99999-9999|O|SOMENAME|99999999|F|999-99-9999|SOMEADDRESS||SOMECITY|ST|99999|999-999-99991|CLI|99999999|99999999|O|W|2|12508|99999-9999|O||||||||SOMENAME||99999999|2707||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||4|1XM0TM6DT02|SOMECOMPANY||1XM0TM6DT02|1|Self
1|13167|99999-9999||SOMENAME|99999999|F|999-99-9999|SOMEADDRESS||SOMECITY|ST|99999|999-999-9999|CLI|99999999|99999999|O|M|2|13167|99999-9999|||||||||SOMENAMEA||99999999|2159||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||4|9TP1NQ5MR03|SOMECOMPANY||9TP1NQ5MR03|1|Self
1|13673|99999-9999|O|SOMENAME|99999999|F|999-99-9999|SOMEADDRESS||SOMECITY|ST|99999|999-999-9999|CLI|99999999|99999999|O|M|2|13673|99999-9999|O||||||||SOMENAME||99999999|2707||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||4|DSTW00629242|SOMECOMPANY|XA061|DSTW00629242|1|Spouse

由存储过程生成的每个记录都在其单独的行上。每个记录的第2和第4部分与其对应的第1部分在同一行。

令人困惑的部分是,在VS for Business中,我正在研究RDL,布局看起来像这样:

RDL layout in VS for Business

并且当报告在SSRS中运行时,输出看起来像这样:

SSRS report output sample

您会注意到,对于给定的记录,每个Type部分1、2和4都按预期在一行上。

我只是想不出如何将其保存在以竖线分隔的文本文件中。坦白说,我们很困惑,想知道在SSRS RDL中是否还可以做到这一点,除了在生成文件后创建一个将每个部分放在自己的行上的批处理文件之外。

sql-server reporting-services ssms ssrs-2012 rdl
1个回答
0
投票

您可以通过运行一些脚本来实现该过程,该脚本处理由过程生成的输出文件(在事务类型节组的一行中产生结果)。

尝试以下操作:

exec master..xp_cmdshell 'bcp "exec dbname.schemaname.procedurename" queryout "filepath" -T -c -r\n -S servername\instanacename'
set @sql = '%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\powershell.exe -c "[System.IO.File]::ReadAllText(''filepath_which_is_generated_by_procedure'') -replace ''\|([24]\|)'',\"`r`n`$1\"  | Set-Content ''finaloutputfilepath'' 

我已使用PowerShell完成此任务。

输出:Output_Sample

© www.soinside.com 2019 - 2024. All rights reserved.