需要将XML节点作为其自己的数据子集拉出,而不是使用SQL添加列

需要将XML节点作为其自己的数据子集拉出,而不是使用SQL添加列,sql,sql-server,xml,ssis,Sql,Sql Server,Xml,Ssis,我正在解析SSIS包.dtsx文件中的数据。我的大部分东西都在工作。我想得到的一个附加数据位是关于executesql脚本部分的参数绑定的信息。 以下是XML的外观: <SQLTask:SqlTaskData xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask" SQLTask:Connection="{37575B9B-BC41-4E1A-98FC-1C1B276F8394}" SQLTask:SqlStateme

我正在解析SSIS包.dtsx文件中的数据。我的大部分东西都在工作。我想得到的一个附加数据位是关于executesql脚本部分的参数绑定的信息。 以下是XML的外观:

<SQLTask:SqlTaskData xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask" 
SQLTask:Connection="{37575B9B-BC41-4E1A-98FC-1C1B276F8394}" 
SQLTask:SqlStatementSource="INSERT INTO tblRunLog (&#xA;      StartedTimestamp, &#xA;      UserID, &#xA;      MachineID, &#xA;      ApplicationID, &#xA;      SystemID,&#xA;      ProgramID,&#xA;      RunDate,&#xA;      Client &#xA; ) &#xA;VALUES ( &#xA;      ?,&#xA;      REPLACE (?, 'ad-ent\', ''),&#xA;      ?,&#xA;      ?,&#xA;      ?,&#xA;      ?,&#xA;      CONVERT( VARCHAR(10), GETDATE(), 120 ),&#xA;      'ALL'&#xA;)&#xA;SELECT CAST(SCOPE_IDENTITY() AS INT) AS RunLogId&#xA;" 
SQLTask:ResultType="ResultSetType_SingleRow">
<SQLTask:ResultBinding 
SQLTask:ResultName="RunLogId" 
SQLTask:DtsVariableName="User::RunLogId" />
<SQLTask:ParameterBinding SQLTask:ParameterName="0" SQLTask:DtsVariableName="System::StartTime" SQLTask:ParameterDirection="Input" SQLTask:DataType="7" SQLTask:ParameterSize="-1" />
<SQLTask:ParameterBinding SQLTask:ParameterName="1" SQLTask:DtsVariableName="System::UserName" SQLTask:ParameterDirection="Input" SQLTask:c="129" SQLTask:ParameterSize="-1" />
<SQLTask:ParameterBinding SQLTask:ParameterName="2" SQLTask:DtsVariableName="System::MachineName" SQLTask:ParameterDirection="Input" SQLTask:DataType="129" SQLTask:ParameterSize="-1" />
<SQLTask:ParameterBinding SQLTask:ParameterName="3" SQLTask:DtsVariableName="System::PackageName" SQLTask:ParameterDirection="Input" SQLTask:DataType="129" SQLTask:ParameterSize="-1" />
<SQLTask:ParameterBinding SQLTask:ParameterName="4" SQLTask:DtsVariableName="User::SystemId" SQLTask:ParameterDirection="Input" SQLTask:DataType="3" SQLTask:ParameterSize="-1" />
<SQLTask:ParameterBinding SQLTask:ParameterName="5" SQLTask:DtsVariableName="User::DTSX_Path" SQLTask:ParameterDirection="Input" SQLTask:DataType="129" SQLTask:ParameterSize="-1" />
</SQLTask:SqlTaskData>
我可以得到我想要的数据,但我想实际地将其作为一个子集进行拉取,然后根据需要使用动态行引用原始数据集,而不是当数据不存在时为空的静态拉取。 我对它进行了一些修补,但无法得到我想要的工作。我可以使用/*来运行的组合从未出现过XML数据

我的一次尝试仅返回空字符串的示例:

    ;WITH XMLNAMESPACES (
     'www.microsoft.com/SqlServer/Dts' AS DTS
,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask
   )
select 

    A.ProjectItem.query('.').query('./SQLTask:SqlTaskData[@SQLTask:ParameterBinding]/*') ExecPkgTaskQry
    FROM ##tmp_SSISpkgControlFlow cf
        CROSS APPLY Cf.SqlTaskQry.nodes('./*') AS A(ProjectItem)
        where cf.tasktype like '%ExecuteSQLTask%'
SQL+XML的家伙们能给你的任何帮助都会很棒

更新,供其他寻求答案的人使用。下面是修复错误后我的原型代码的样子:

;WITH XMLNAMESPACES (
     'www.microsoft.com/SqlServer/Dts' AS DTS
,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask
   )
select *
from (
    select 
        data.*
        ,Pnodes.x.value('(@SQLTask:ParameterName)[1]', 'VARCHAR(250)') AS ParameterName
        ,Pnodes.x.value('(@SQLTask:DtsVariableName)[1]', 'VARCHAR(250)') AS DtsVariableName
        ,Pnodes.x.value('(@SQLTask:ParameterDirection)[1]', 'VARCHAR(250)') AS ParameterDirection
        ,Pnodes.x.value('(@SQLTask:DataType)[1]', 'VARCHAR(250)') AS DataType
        ,Pnodes.x.value('(@SQLTask:ParameterSize)[1]', 'VARCHAR(250)') AS ParameterSize
    from (
        select 
            cf.TaskName, cf.RowID,
            A.ProjectItem.query('.').query('./SQLTask:SqlTaskData[SQLTask:ParameterBinding]/*') ParameterData
        FROM ##tmp_SSISpkgControlFlow cf
            CROSS APPLY Cf.SqlTaskQry.nodes('.') AS A(ProjectItem)
        where cf.tasktype like '%ExecuteSQLTask%'
    ) as data
        CROSS APPLY data.ParameterData.nodes('./*') AS Pnodes(x)    
    where len(cast(data.ParameterData as varchar(max))) > 0
) as datatwo
where datatwo.ParameterName is not null

我不清楚您实际上想要实现什么,但在这一部分中有一个简单的错误使您的第二次查询没有返回结果:

./SQLTask:SqlTaskData[@SQLTask:ParameterBinding]/*
您发布的XML中的
SqlTaskData
元素没有属性
SQLTask:ParameterBinding
。它应该是子元素而不是属性:

./SQLTask:SqlTaskData[SQLTask:ParameterBinding]/*

谢谢我正在通过解析XML为SSIS包创建一个标准化的文档集。
./SQLTask:SqlTaskData[SQLTask:ParameterBinding]/*