8

我正在寻找一些东西来提取我的 SSIS/DTSX 包中存在的所有 SQL 查询。但到目前为止,没有什么能帮助我。

我已经看过 Microsoft 的 Microsoft.SqlServer.DTS API。但他们正在直接提取一些查询。但是DTS:variable TAG中存在的查询不会被提取。

我想要.Net框架中的东西。因为我还需要使用输出来执行其他一些任务。我正在使用 C#。

示例代码如下。不能解决所有情况

// this function takes the list of task hosts as input
// and gives all the queries present in taskhosts.

public static string ExtractQueriesFromTasks(List<TaskHost> Tasks)
{
    string src_query = "";
    foreach (TaskHost executable in Tasks)
    {
        DtsContainer Seq_container = (DtsContainer)executable;
        if (executable.InnerObject.GetType().Name == "ExecuteSQLTask")
        {
            ExecuteSQLTask sqlTask = (ExecuteSQLTask)executable.InnerObject;
            string src_query2 = sqlTask.SqlStatementSource;

            src_query = src_query + "\n" + src_query2.ToUpper();
        }
        if (executable.InnerObject.GetType().Name == "__ComObject")
        {
            IDTSPipeline100 sqlTask = (IDTSPipeline100)executable.InnerObject;
            Console.WriteLine(Microsoft.VisualBasic.Information.TypeName(executable.InnerObject));
            //ExecuteSQLTask sqlTask = (ExecuteSQLTask)executable.InnerObject;
            //string src_query2 = sqlTask.SqlStatementSource;

            //src_query = src_query + "\n" + src_query2.ToUpper();
        }


        if (executable.InnerObject.GetType().Name == "ScriptTask")
        {
            ExecuteSQLTask sqlTask = (ExecuteSQLTask)executable.InnerObject;
            string src_query2 = sqlTask.SqlStatementSource;

            src_query = src_query + "\n" + src_query2.ToUpper();
        }
    }
    return src_query;
}
4

2 回答 2

3

以下查询有助于检索 SSIS 包内的所有 sql 语句

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

-- Query to Extract SQL Tasks with Name and SQL Statement 
SELECT Pkg.props.value('../../DTS:Property[@DTS:Name="ObjectName"]
[1]','varchar(MAX)') ObjectName, 
Pkg.props.value('(@SQLTask:SqlStatementSource)[1]', 'NVARCHAR(MAX)') AS 
SqlStatement FROM (select cast(pkgblob.BulkColumn as XML) pkgXML from 
openrowset(bulk 'Your DTS package with name and location Path',single_blob) 
as pkgblob) t CROSS APPLY pkgXML.nodes('//DTS:ObjectData//SQLTask:SqlTaskData') Pkg(props) 
UNION 

-- Query to Extract DTS Pipline task with Name and SqlCommand 

SELECT Pkg.props.value('../../../../DTS:Property[@DTS:Name="ObjectName"]
[1]','varchar(MAX)') ObjectName, 
Pkg.props.value('data(./properties/property[@name=''SqlCommand''])[1]', 
'varchar(max)') SqlStatement FROM(select cast(pkgblob.BulkColumn as XML) 
 pkgXML from openrowset(bulk 'Your DTS package with name and location 
 Path',single_blob) as pkgblob) t CROSS APPLY 
pkgXML.nodes('//DTS:Executable//pipeline//components//component') Pkg(props) 
WHERE Pkg.props.value('data(./properties/property[@name=''SqlCommand''])
[1]', 'varchar(max)') <>''
于 2016-01-29T21:02:33.003 回答
0

还有另一种方法。

您可以创建自定义日志事件。它写在这里:

为 ssis 任务启用自定义日志记录

然后你只需要运行包并解析创建的日志文件。

虽然我不确定 DTS,但应该从 SSIS 包中的表达式等中获取所有 SQL。

于 2013-08-20T20:48:23.893 回答