我一直在思考一个相当简单的想法,即从底层数据库导出 ReportServer 报告,然后找到其依赖的存储过程并导出它们。
但是,在最初测试时,我发现报告本身的 XML 数据以我将内容导出到文件的标准方式被截断,我认为我可能使用了不正确的方法。
此时代码相当简单,我正在使用一个名为“ChartReport”的简化报告:
Import-Module 'sqlps'
$saveloc = "$home\savedata\filename.txt"
$dataquery = @"
DECLARE @name NVARCHAR(MAX)='ChartReport',
@path NVARCHAR(MAX) = '/ChartReport'
SELECT CAST(CAST(c.Content AS VARBINARY(MAX)) AS XML) [ReportData], c.Name, c.Path
FROM ReportServer.dbo.Catalog c
WHERE c.Name = @name
AND c.Path LIKE @path+'%'
"@
Invoke-SQLCMD -Query $dataquery | select ReportData | Out-File $saveloc
我已经验证查询返回 XML(底层 XML 文件本身超过 25000 个字符,如果有人感兴趣,我很乐意提供指向它的链接),但是当我保存文件时,我得到类似以下内容:
第 1 列
<报告 xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"xmlns:cl="http://schemas.microsof...
我尝试使用一些已经发布在 SO 上的想法,例如:
> $somefile Powershell 2: Easy way to direct every bit of output to a file?
输出文件并指定宽度 Powershell Add-Content Truncating Output
将格式表与 -autosize 和 -wrap 结合使用
其中每一个都会在某个时刻失败(尽管 format-table 方法在截断之前已经走了很远)。
我肯定会考虑某种特定于 XML 的解决方案,但实际上我认为这只是我丢失了一些信息。据我考虑,这是一个“东西”文件,我想在将所述文件加载到对象中后将其写入磁盘。
迭代某种换行符并将对象的每一行写入文件是惯用的答案吗?
最佳答案
使用 Invoke-SQLCMD 命令的 -MaxCharLength 参数。默认为 4000。
关于sql-server - 使用 Powershell 从存储过程返回的数据(大型 XML 文件)从 ReportServer 输出 XML 时如何停止截断数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20673814/