需要拉出 XML 节点作为其自己的数据子集,而不是使用 SQL 添加列
Need to pull out XML node as its own data subset instead of added columns using SQL
我正在从 SSIS 包 .dtsx 文件中解析数据。我有大部分工作。我想获得的一个附加数据位是有关执行 SQL 脚本部分的参数绑定的信息。
这是 XML 的样子:
<SQLTask:SqlTaskData xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask"
SQLTask:Connection="{37575B9B-BC41-4E1A-98FC-1C1B276F8394}"
SQLTask:SqlStatementSource="INSERT INTO tblRunLog (
 StartedTimestamp, 
 UserID, 
 MachineID, 
 ApplicationID, 
 SystemID,
 ProgramID,
 RunDate,
 Client 
 ) 
VALUES ( 
 ?,
 REPLACE (?, 'ad-ent\', ''),
 ?,
 ?,
 ?,
 ?,
 CONVERT( VARCHAR(10), GETDATE(), 120 ),
 'ALL'
)
SELECT CAST(SCOPE_IDENTITY() AS INT) AS RunLogId
"
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>
这是我目前的 SQL 代码
;WITH XMLNAMESPACES (
'www.microsoft.com/SqlServer/Dts' AS DTS
,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask
)
select
A.ProjectItem.value('(./@SQLTask:Connection)[1]', 'VARCHAR(250)') AS ConnectionID
,A.ProjectItem.value('(./@SQLTask:SqlStatementSource)[1]', 'nvarchar(max)') AS SQLStatement
,A.ProjectItem.value('(./@SQLTask:ResultType)[1]', 'VARCHAR(250)') AS ResultType
,A.ProjectItem.value('(./SQLTask:ResultBinding/@SQLTask:ResultName)[1]','nvarchar(max)') as ResultName
,A.ProjectItem.value('(./SQLTask:ResultBinding/@SQLTask:DtsVariableName)[1]','nvarchar(max)') as ResultDtsVariableName
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[1]','nvarchar(max)') as p1name
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:DtsVariableName)[1]','nvarchar(max)') as p1var
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterDirection)[1]','nvarchar(max)') as p1dir
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:DataType)[1]','nvarchar(max)') as p1type
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterSize)[1]','nvarchar(max)') as p1size
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterSize)[1]','nvarchar(max)') as p2
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[2]','nvarchar(max)') as p3
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[3]','nvarchar(max)') as p4
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[4]','nvarchar(max)') as p5
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[5]','nvarchar(max)') as p6
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[6]','nvarchar(max)') as p7
FROM ##tmp_SSISpkgControlFlow cf
CROSS APPLY Cf.SqlTaskQry.nodes('./*') AS A(ProjectItem)
where cf.tasktype like '%ExecuteSQLTask%'
我可以获得我想要的数据,但我想将其作为一个子集实际拉取,然后根据需要使用动态行引用原始数据集,而不是在数据为空时静态拉取不在那里。
我对它进行了一些修改,但无法得到我想要的工作。我可以使用 /* 得到 运行 的组合从来没有想出 XML 数据。
我的一个尝试示例,只是 returns 个空字符串:
;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
我不清楚你实际上想要实现什么,但是一个简单的错误导致你的第二个查询returns在这部分没有结果:
./SQLTask:SqlTaskData[@SQLTask:ParameterBinding]/*
您发布的 XML 中的 SqlTaskData
元素没有属性 SQLTask:ParameterBinding
。它应该是子元素而不是属性:
./SQLTask:SqlTaskData[SQLTask:ParameterBinding]/*
我正在从 SSIS 包 .dtsx 文件中解析数据。我有大部分工作。我想获得的一个附加数据位是有关执行 SQL 脚本部分的参数绑定的信息。 这是 XML 的样子:
<SQLTask:SqlTaskData xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask"
SQLTask:Connection="{37575B9B-BC41-4E1A-98FC-1C1B276F8394}"
SQLTask:SqlStatementSource="INSERT INTO tblRunLog (
 StartedTimestamp, 
 UserID, 
 MachineID, 
 ApplicationID, 
 SystemID,
 ProgramID,
 RunDate,
 Client 
 ) 
VALUES ( 
 ?,
 REPLACE (?, 'ad-ent\', ''),
 ?,
 ?,
 ?,
 ?,
 CONVERT( VARCHAR(10), GETDATE(), 120 ),
 'ALL'
)
SELECT CAST(SCOPE_IDENTITY() AS INT) AS RunLogId
"
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>
这是我目前的 SQL 代码
;WITH XMLNAMESPACES (
'www.microsoft.com/SqlServer/Dts' AS DTS
,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask
)
select
A.ProjectItem.value('(./@SQLTask:Connection)[1]', 'VARCHAR(250)') AS ConnectionID
,A.ProjectItem.value('(./@SQLTask:SqlStatementSource)[1]', 'nvarchar(max)') AS SQLStatement
,A.ProjectItem.value('(./@SQLTask:ResultType)[1]', 'VARCHAR(250)') AS ResultType
,A.ProjectItem.value('(./SQLTask:ResultBinding/@SQLTask:ResultName)[1]','nvarchar(max)') as ResultName
,A.ProjectItem.value('(./SQLTask:ResultBinding/@SQLTask:DtsVariableName)[1]','nvarchar(max)') as ResultDtsVariableName
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[1]','nvarchar(max)') as p1name
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:DtsVariableName)[1]','nvarchar(max)') as p1var
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterDirection)[1]','nvarchar(max)') as p1dir
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:DataType)[1]','nvarchar(max)') as p1type
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterSize)[1]','nvarchar(max)') as p1size
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterSize)[1]','nvarchar(max)') as p2
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[2]','nvarchar(max)') as p3
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[3]','nvarchar(max)') as p4
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[4]','nvarchar(max)') as p5
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[5]','nvarchar(max)') as p6
,A.ProjectItem.value('(./SQLTask:ParameterBinding/@SQLTask:ParameterName)[6]','nvarchar(max)') as p7
FROM ##tmp_SSISpkgControlFlow cf
CROSS APPLY Cf.SqlTaskQry.nodes('./*') AS A(ProjectItem)
where cf.tasktype like '%ExecuteSQLTask%'
我可以获得我想要的数据,但我想将其作为一个子集实际拉取,然后根据需要使用动态行引用原始数据集,而不是在数据为空时静态拉取不在那里。 我对它进行了一些修改,但无法得到我想要的工作。我可以使用 /* 得到 运行 的组合从来没有想出 XML 数据。
我的一个尝试示例,只是 returns 个空字符串:
;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
我不清楚你实际上想要实现什么,但是一个简单的错误导致你的第二个查询returns在这部分没有结果:
./SQLTask:SqlTaskData[@SQLTask:ParameterBinding]/*
您发布的 XML 中的 SqlTaskData
元素没有属性 SQLTask:ParameterBinding
。它应该是子元素而不是属性:
./SQLTask:SqlTaskData[SQLTask:ParameterBinding]/*