You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell读取XML创建SSRS订阅遇类型转换错误如何解决

问题根因

报错的核心原因是你从XML中读取到的DeliverySettings、Values都是XML节点对象,属于2005版本SSRS导出的序列化结构,和SQL 2019的ReportService2010代理所需的强类型不兼容,无法直接作为参数传入接口。另外你当前的代码把CreateSubscription调用放在了foreach循环之外,仅能处理最后一个订阅,也需要调整。

解决方法

手动解析XML节点内容,构造SQL 2019 SSRS代理对应的强类型参数,再调用创建接口,修改后的代码如下:

# 读取XML文件
[XML]$userfile = Get-Content "E:\Test_File.xml" 
$Subscriptions = $userfile.Objs.Obj.MS 

# 连接2019 SSRS服务获取代理
$ReportServerUri = 'http://vsql2019test/reportserver'
$Proxy = New-RSWebServiceProxy -ReportServerUri $ReportServerUri 

# 获取2019 SSRS代理的命名空间,用于构造强类型对象
$rsNamespace = $Proxy.GetType().Namespace

foreach ($sub in $Subscriptions )
{
    # 读取基础字符串参数
    $Report_Path = ($sub.S | Where-Object {$_.N -EQ 'Path'}).'#text' 
    $Description = ($sub.S | Where-Object {$_.N -EQ 'Description'}).'#text' 
    $EventType = ($sub.S | Where-Object {$_.N -EQ 'EventType'}).'#text' 
    $MatchData = ($sub.S | Where-Object {$_.N -EQ 'MatchData'}).'#text' 

    # 构造DeliverySettings强类型对象
    $DeliveryNode = $sub.Obj | Where-Object {$_.N -EQ 'DeliverySettings'} 
    $DeliverySettings = New-Object "$rsNamespace.ExtensionSettings"
    $DeliverySettings.Extension = ($DeliveryNode.Props.S | Where-Object {$_.N -eq 'Extension'}).'#text'

    # 构造传递参数数组
    $deliveryParams = @()
    foreach ($pNode in $DeliveryNode.Props.Obj.LST.Obj) {
        $param = New-Object "$rsNamespace.ParameterValue"
        $param.Name = ($pNode.Props.S | Where-Object {$_.N -eq 'Name'}).'#text'
        $param.Value = ($pNode.Props.S | Where-Object {$_.N -eq 'Value'}).'#text'
        $deliveryParams += $param
    }
    # 补充导出时缺失的共享路径密码
    $passParam = New-Object "$rsNamespace.ParameterValue"
    $passParam.Name = 'PASSWORD'
    $passParam.Value = '你的文件共享访问密码' # 统一密码可以直接写,不同密码可以做映射表匹配
    $deliveryParams += $passParam
    $DeliverySettings.ParameterValues = $deliveryParams

    # 构造报表参数Values强类型数组
    $ValuesNode = $sub.Obj | Where-Object {$_.N -EQ 'Values'}
    $reportParams = @()
    foreach ($rpNode in $ValuesNode.LST.Obj) {
        $rp = New-Object "$rsNamespace.ParameterValue"
        $rp.Name = ($rpNode.Props.S | Where-Object {$_.N -eq 'Name'}).'#text'
        $rp.Value = ($rpNode.Props.S | Where-Object {$_.N -eq 'Value'}).'#text'
        $reportParams += $rp
    }

    # 调用接口创建订阅
    $Proxy.CreateSubscription($Report_Path, $DeliverySettings, $Description, $EventType, $MatchData, $reportParams)
    Write-Host "订阅创建成功:$Description"
}

注意事项

  • 若SQL 2019上的报表路径、共享路径、账号信息和2005不一致,可在循环中批量替换对应参数取值
  • 如果是数据驱动订阅,需要调整构造参数的逻辑,匹配对应的数据驱动订阅接口

内容的提问来源于stack exchange,提问作者Gemini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:36:06