为什么<root>通过SSIS / C#显示在我的XML中?

时间:2017-02-23 11:01:09

标签: xml ssis sql-server-2012

我有一个类似下面的标量函数

CREATE FUNCTION Logging.ParentDataSourceStatus
(
    @ParentDataSourceKey INT
)
RETURNS XML
AS
BEGIN
DECLARE
    @Xml XML

SET
@Xml = (
    SELECT
        ExecutionStatus.ExecutionStatus
    ,   ParentDataSourceSummary.TotalErrorRows

    FROM
        Logging.ParentDataSourceSummary
        JOIN Logging.ExecutionStatus
            ON ParentDataSourceSummary.ParentDataSourceStatus = ExecutionStatus.ExecutionStatusCode

    WHERE
        ParentDataSourceSummary.ParentDataSourceKey = @ParentDataSourceKey

    FOR XML PATH (''), ROOT ('ParentDataSourceStatus')
)
RETURN @Xml
END

当我在SSMS中查询时返回以下XML

<ParentDataSourceStatus>
  <ExecutionStatus>Complete</ExecutionStatus>
  <TotalErrorRows>0</TotalErrorRows>
</ParentDataSourceStatus>

我在SSIS包中的执行SQL任务中使用此函数,使用XML作为返回结果集,通过ADO.NET连接使用语句:

SELECT Logging.ParentDataSourceStatus(1614)

返回的结果存储在object类型的变量中。当我在脚本任务中读取此变量时:

XmlDocument xml = (XmlDocument)Dts.Variables["User::ParentDataSourceStatus"].Value;

调试器显示InnerXml如下:

<ROOT>
  <ParentDataSourceStatus>
    <ExecutionStatus>Complete</ExecutionStatus>
    <TotalErrorRows>0</TotalErrorRows>
  </ParentDataSourceStatus>
</ROOT>

我已经在函数中命名了根元素,所以在哪里添加<ROOT>我可以摆脱它吗?

2 个答案:

答案 0 :(得分:1)

当从执行SQL任务返回XML结果集时,它似乎将结果添加到<ROOT></ROOT>节点。

没有选项可以禁用此功能,并且必须进一步操作XML中返回的结果以将其删除。

答案 1 :(得分:0)

使用replace来处理您要遵循的代码:

string content = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + Dts.Variables["User::DataXML"].Value.ToString().Replace("<ROOT>", "").Replace("</ROOT>", "");

(我也在乞求中添加xml文件并对其进行编码)