/*
Author: Divya Agrawal
Original link: http://www.sqlservercentral.com/articles/Integration+Services+(SSIS)/128862/
*/


ALTER PROCEDURE [dbo].[usp_GetPackageDetails] @Path VARCHAR(8000) = 'C:\Packages1'
AS
/*
exec [usp_GetPackageDetails]   'C:\Packages1' 

exec sp_configure 'show advanced options',1
reconfigure with override
go
exec sp_configure 'xp_cmdshell',1
reconfigure with override
*/
BEGIN
    SET NOCOUNT ON;

    --------------------drop all temp tables------------------------------------
    IF OBJECT_id('pkgStats') IS NOT NULL
        DROP TABLE pkgStats;

    IF OBJECT_id('ConnectionDetails') IS NOT NULL
        DROP TABLE ConnectionDetails;

    IF OBJECT_id('PackageAnalysis') IS NOT NULL
        DROP TABLE PackageAnalysis;

    IF OBJECT_id('TblPrecedenceConstraint') IS NOT NULL
        DROP TABLE TblPrecedenceConstraint;

    IF OBJECT_id('TblControlFlowDetails') IS NOT NULL
        DROP TABLE TblControlFlowDetails;

    IF OBJECT_id('TblScriptTaskdetails') IS NOT NULL
        DROP TABLE TblScriptTaskdetails;

    IF OBJECT_id('TblExecutePackageTaskDetails') IS NOT NULL
        DROP TABLE TblExecutePackageTaskDetails;

    IF OBJECT_id('TblSQLTaskDetails') IS NOT NULL
        DROP TABLE TblSQLTaskDetails;

    IF OBJECT_id('TblDFTTaskDetails') IS NOT NULL
        DROP TABLE TblDFTTaskDetails;

    IF OBJECT_id('TblSrcDestDetails') IS NOT NULL
        DROP TABLE TblSrcDestDetails;

    IF OBJECT_id('TblDerivedTaskDetails') IS NOT NULL
        DROP TABLE TblDerivedTaskDetails;

    IF OBJECT_id('TblLookupTaskDetails') IS NOT NULL
        DROP TABLE TblLookupTaskDetails;

    IF OBJECT_id('TblVariableDetails') IS NOT NULL
        DROP TABLE TblVariableDetails;
    IF OBJECT_id('TblParameterDetails') IS NOT NULL
        DROP TABLE TblParameterDetails;
    IF OBJECT_id('tempdb.dbo.#tempprecedence1') IS NOT NULL
        DROP TABLE #tempprecedence1;

    IF OBJECT_id('tempdb.dbo.#tempprecedence2') IS NOT NULL
        DROP TABLE #tempprecedence2;

    IF OBJECT_id('tempdb.dbo.#tempprecedence3') IS NOT NULL
        DROP TABLE #tempprecedence3;

    IF OBJECT_id('tempdb.dbo.#tempprecedence5') IS NOT NULL
        DROP TABLE #tempprecedence5;
    IF OBJECT_id('tempdb.dbo.#tempprecedence5_Hierarchy') IS NOT NULL
            DROP TABLE #tempprecedence5_Hierarchy;

    IF OBJECT_id('tempdb.dbo.#tempprecedence4') IS NOT NULL
        DROP TABLE #tempprecedence4;

    IF OBJECT_id('tempdb.dbo.#tempprecedence6') IS NOT NULL
        DROP TABLE #tempprecedence6;

    -------------------drop all temp tables------------------------------------
    ------------------create all tables-------------------------------------------
    CREATE TABLE pkgStats (
        RowID INT identity(1, 1) NOT NULL PRIMARY KEY
        ,PackagePath VARCHAR(8000) NOT NULL
        ,PackageXML XML NOT NULL
        ,PackageCreatorName VARCHAR(1000) NULL
        ,PackageProtectionLevel varchar(100) null
        );

    CREATE TABLE ConnectionDetails (
        ConnectionManager VARCHAR(5000)
        ,ConnectionManagerID VARCHAR(100)
        );

    CREATE TABLE PackageAnalysis (
        TableRowID INT identity(1, 1) NOT NULL
        ,PackageSequenceNo INT
        ,SequenceNo INT
        ,RowID INT
        ,PackagePath VARCHAR(5000)
        ,PackageName VARCHAR(max)
        ,Category VARCHAR(1000)
        ,PackageCreatorName VARCHAR(1000)
        ,PackageProtectionLevel Varchar(100)
        ,TaskPath VARCHAR(max)
        ,ObjectName VARCHAR(500)
        ,ObjectType VARCHAR(max)
        ,ObjectTypeDescription VARCHAR(max)
        ,DelayValidationPropertyValue VARCHAR(10)
        ,ObjectValue VARCHAR(max)
        ,ExpressionValue VARCHAR(5000)
        ,ConnectionManager VARCHAR(5000)
        ,SourceColumn VARCHAR(5000)
        ,DestinationColumn VARCHAR(5000)
        ,SortKeyPosition varchar(10)
        ,DerivedValue VARCHAR(5000)
        ,IsDisabled VARCHAR(10)
        ,ResultSetParameterName VARCHAR(1000)
        ,ParameterBindingSequence VARCHAR(1000)
        ,ParameterBindingParameterName VARCHAR(1000)
        --,ObjectPathFrom VARCHAR(8000)
        --,ObjectPathTo VARCHAR(8000)
        ,ExecutePackageExpression VARCHAR(8000)
        ,ExecutedPackageName VARCHAR(8000)
        ,ExecutePackageConnection VARCHAR(8000)
        ,Script VARCHAR(max)
        ,Variable VARCHAR(1000)
        ,ConnectionManagerID VARCHAR(100)
        ,LookupJoins VARCHAR(8000)
        ,IsSortedProperty varchar(10)
        ,MultihashcolumnSortPosition varchar(max)
        ,RetainSameConnectionProperty varchar(100)
        );

    CREATE CLUSTERED INDEX CX_ControlFlow ON PackageAnalysis (TableRowID);

    CREATE TABLE TblPrecedenceConstraint (
        RowID INT
        ,PackagePath VARCHAR(2000)
        ,TaskFrom VARCHAR(1000)
        ,Taskto VARCHAR(1000)
        ,PrecOrder INT
        ,PrecOrder1 INT
        ,TaskType VARCHAR(1000)
        );

    CREATE TABLE TblVariableDetails (
        VariableRowID INT identity(1, 1) NOT NULL
        ,RowID INT
        ,PackagePath VARCHAR(5000)
        ,PackageName VARCHAR(max)
        ,Category VARCHAR(1000)
        ,PackageCreatorName VARCHAR(1000)
        ,TaskPath VARCHAR(max)
        ,ObjectName VARCHAR(500)
        ,ObjectType VARCHAR(max)
        ,ObjectValue VARCHAR(max)
        ,ExpressionValue VARCHAR(5000)
        ,VariableHexValue VARCHAR(1000)
        );

    CREATE CLUSTERED INDEX CX_Variable ON TblVariableDetails (VariableRowID);

        CREATE TABLE TblParameterDetails (
        ParameterRowID INT identity(1, 1) NOT NULL
        ,RowID INT
        ,PackagePath VARCHAR(5000)
        ,PackageName VARCHAR(max)
        ,Category VARCHAR(1000)
        ,PackageCreatorName VARCHAR(1000)
        ,TaskPath VARCHAR(max)
        ,ObjectName VARCHAR(500)
        ,ObjectType VARCHAR(max)
        ,ObjectValue VARCHAR(max)
        ,ExpressionValue VARCHAR(5000)
        ,ParameterHexValue VARCHAR(1000)
        );

    CREATE CLUSTERED INDEX CX_Variable ON TblParameterDetails (ParameterRowID);
    CREATE TABLE TblControlFlowDetails (
        ControlFlowDetailsRowID INT identity(1, 1) NOT NULL
        ,RowID INT
        ,TaskPath VARCHAR(8000)
        ,TaskName VARCHAR(2000)
        ,TaskTypeDescription VARCHAR(MAX)
        ,TaskType VARCHAR(5000)
        ,DelayValidationPropertyValue VARCHAR(100)
        ,DFTQuery XML
        ,SqlTaskQry XML
        ,ExecPkgTaskQry XML
        ,ScriptTaskQry XML
        ,IsDisabled VARCHAR(10)
        ,ExpressionValue VARCHAR(5000)
        );

    CREATE CLUSTERED INDEX CX_ControlFlow ON TblControlFlowDetails (
        ControlFlowDetailsRowID
        ,RowID
        );

    CREATE NONCLUSTERED INDEX NCX_ControlFlow ON TblControlFlowDetails (RowID);

    CREATE TABLE TblScriptTaskdetails (
        RowID INT
        ,ControlFlowDetailsRowID INT
        ,Script VARCHAR(max)
        );

    CREATE CLUSTERED INDEX CX_TblScriptTaskdetails ON TblScriptTaskdetails (
        ControlFlowDetailsRowID
        ,RowID
        );

    CREATE TABLE TblExecutePackageTaskDetails (
        RowID INT
        ,ControlFlowDetailsRowID INT
        ,ExecutePackageExpression VARCHAR(1000)
        ,ExecutedPackageName VARCHAR(1000)
        ,ExecutePackageConnection VARCHAR(1000)
        );

    CREATE CLUSTERED INDEX CX_TblExecutePackageTaskDetails ON TblExecutePackageTaskDetails (
        ControlFlowDetailsRowID
        ,RowID
        );

    CREATE TABLE TblSQLTaskDetails (
        RowID INT
        ,ControlFlowDetailsRowID INT
        ,ResultSetParameterName VARCHAR(1000)
        ,ParameterBindingSequence VARCHAR(1000)
        ,ParameterBindingParameterName VARCHAR(1000)
        );

    CREATE CLUSTERED INDEX CX_TblSQLTaskDetails ON TblSQLTaskDetails (
        ControlFlowDetailsRowID
        ,RowID
        );

    CREATE TABLE TblDFTTaskDetails (
        DataFlowDetailsRowID INT identity(1, 1) NOT NULL
        ,RowID INT
        ,DFTTaskName VARCHAR(max)
        ,DFTTasksPath VARCHAR(max)
        ,DFTTaskType VARCHAR(max)
        ,DFTTaskType1 VARCHAR(max)
        ,DFTRowSet VARCHAR(max)
        ,ParameterBindingParameterName VARCHAR(2000)
        ,DFTSQLCommand VARCHAR(max)
        ,DFTConnectionManager VARCHAR(max)
        ,Variable VARCHAR(max)
        ,InputQry XML
        ,OutputQry XML
        ,IsSortedProperty VARCHAR(10)
            ,MultihashcolumnSortPosition varchar(max)
        );

    CREATE CLUSTERED INDEX CX_TblDFTTaskDetails ON TblDFTTaskDetails (
        DataFlowDetailsRowID
        ,RowID
        );

    CREATE NONCLUSTERED INDEX NCX_TblDFTTaskDetails ON TblDFTTaskDetails (RowID);

    CREATE TABLE TblSrcDestDetails (
        DataFlowDetailsRowID INT
        ,RowID INT
        ,SourceColumn VARCHAR(8000)
        ,DestinationColumn VARCHAR(8000)
        ,SortKeyPosition varchar(10)
    
        );

    CREATE CLUSTERED INDEX CX_TblSrcDestDetails ON TblSrcDestDetails (
        DataFlowDetailsRowID
        ,RowID
        );

    CREATE TABLE TblDerivedTaskDetails (
        DataFlowDetailsRowID INT
        ,RowID INT
        ,DerivedValue VARCHAR(8000)
        ,SourceColumn VARCHAR(8000)
        ,DestinationColumn VARCHAR(8000)
        );

    CREATE CLUSTERED INDEX CX_TblDerivedTaskDetails ON TblDerivedTaskDetails (
        DataFlowDetailsRowID
        ,RowID
        );

    CREATE TABLE TblLookupTaskDetails (
        DataFlowDetailsRowID INT
        ,RowID INT
        ,LookupJoins VARCHAR(8000)
        ,SourceColumn VARCHAR(8000)
        ,DestinationColumn VARCHAR(8000)
        );

    CREATE CLUSTERED INDEX CX_TblLookupTaskDetails ON TblLookupTaskDetails (
        DataFlowDetailsRowID
        ,RowID
        );
--------------------------create all tables-------------------------------------------
    -------------------Iterate over all dtsx files from folder------------------------------
    SET @Path = @Path + '\*.dtsx';

    DECLARE @MyFiles TABLE (
        MyID INT IDENTITY(1, 1) PRIMARY KEY
        ,FullPath VARCHAR(8000)
        );
    DECLARE @CommandLine VARCHAR(8000);

    SELECT @CommandLine = LEFT('dir "' + @Path + '" /A-D /B /S ', 8000);

    INSERT INTO @MyFiles (FullPath)
    EXECUTE xp_cmdshell @CommandLine;

    DELETE
    FROM @MyFiles
    WHERE FullPath IS NULL
        OR FullPath = 'File Not Found'
        OR FullPath = 'The system cannot find the path specified.'
        OR FullPath = 'The system cannot find the file specified.';

    --select * from @MyFiles
    DECLARE @FullPath VARCHAR(2000);
    DECLARE @counter INT = 0
        ,@totalpkgcount INT;

    SELECT @totalpkgcount = COUNT(*)
    FROM @MyFiles;

    WHILE @counter <= @totalpkgcount
    BEGIN
        SELECT @FullPath = FullPath
        FROM @MyFiles
        WHERE MyID = @counter;

        DECLARE @sql NVARCHAR(max);

        SET @sql = '
        INSERT  INTO pkgStats (PackagePath,PackageXML)
        select  ''@FullPath'' as PackagePath
        ,       cast(BulkColumn as XML) as PackageXML
        from    openrowset(bulk ''@FullPath'',
                                single_blob) as pkgColumn';

        SELECT @sql = REPLACE(@sql, '@FullPath', @FullPath);

        EXEC sp_executesql @sql;

        SET @counter = @counter + 1;
    END
            -------------------Iterate over all dtsx files from folder------------------------------        
            --select * from pkgStats
            ------------add package creator name---------------------------
            ;

    WITH CTE_PkgLevel
    AS (
        SELECT RowID
            ,PackagePath
            ,PackageXML.value('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
                    /DTS:Executable[1]/@DTS:CreatorName', 'nvarchar(500)') AS PackageCreatorName
            ,PackageXML.value('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
                    /DTS:Executable[1]/@DTS:ProtectionLevel', 'nvarchar(500)')   AS PackageProtectionLevel
        FROM pkgStats pkg
        )
    UPDATE P
    SET PackageCreatorName = C.PackageCreatorName,
        PackageProtectionLevel = C.PackageProtectionLevel
    FROM pkgStats P
    INNER JOIN CTE_PkgLevel C ON P.RowID = C.RowID;


    ------------add package creator name---------------------------
    PRINT '---------------Get all connections-----------------------------------';

    WITH CTE_PkgLevel
    AS (
        SELECT pkg.RowID
            ,pkg.PackagePath
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:ObjectName[1]', 'varchar(max)') AS ConnectionManagerName
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:CreationName[1]', 'varchar(max)') AS ConnectionManagerType
            --, cfnodes1.y.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:ConnectionString[1]', 'varchar(max)') 
            ,cfnodes.x.query('.').query('declare namespace p1="www.microsoft.com/SqlServer/Dts";./p1:ConnectionManager/p1:ObjectData/p1:ConnectionManager') AS ConnectionStringQry
            ,cfnodes.x.query('.').query('declare namespace p1="www.microsoft.com/SqlServer/Dts";./p1:ConnectionManager/p1:PropertyExpression') AS ExpressionQry
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:DTSID[1]', 'varchar(100)') AS ConnectionManagerID
            ,pkg.PackageCreatorName
            
        FROM pkgStats pkg
        CROSS APPLY pkg.PackageXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts";(//DTS:Executable/DTS:ConnectionManagers/*)') AS cfnodes(x)
        )
        ,CTE_PkgConLevel
    AS (
        SELECT pkg.RowID
            ,pkg.PackagePath
            ,pkg.ConnectionManagerName
            ,pkg.ConnectionManagerType
            ,ConnectionManagerID
            --,pkg.ConnectionStringQry
            ,(
                SELECT TOP 1 cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";@p1:ConnectionString[1]', 'nvarchar(max)') AS ConnectionString
                FROM pkg.ConnectionStringQry.nodes('./*') AS cfnodes(x)
                ) AS ConnectionString
            ,(
                SELECT TOP 1 cfnodes.x.value('.', 'nvarchar(max)') AS ExpressionValue
                FROM pkg.ExpressionQry.nodes('./*') AS cfnodes(x)
                ) AS ExpressionValue
            ,PackageCreatorName
            ,(
                SELECT TOP 1 cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";@p1:Retain[1]', 'nvarchar(max)') AS RetainSameConnectionProperty
                FROM pkg.ConnectionStringQry.nodes('./*') AS cfnodes(x)
                ) AS RetainSameConnectionProperty
        FROM CTE_PkgLevel pkg
        )
    INSERT INTO PackageAnalysis (
        RowID
        ,PackagePath
        ,PackageName
        ,Category
        ,PackageCreatorName
        ,ObjectName
        ,ObjectType
        ,DelayValidationPropertyValue
        ,ObjectValue
        ,ExpressionValue
        ,ConnectionManagerID
        ,RetainSameConnectionProperty
        )
    SELECT DISTINCT pkg.RowID
        ,pkg.PackagePath
        ,REPLACE(pkg.PackagePath, REPLACE(@Path, '*.dtsx', ''), '') PackageName
        ,'Connection' AS CategoryC
        ,pkg.PackageCreatorName
        ,cast(pkg.ConnectionManagerName AS VARCHAR(max)) AS ObjectName
        ,cast(pkg.ConnectionManagerType AS VARCHAR(max)) AS ObjectType
        ,'NA' AS DelayValidationPropertyValue
        ,cast(pkg.ConnectionString AS VARCHAR(max)) AS ObjectValue
        ,cast(ExpressionValue AS VARCHAR(max)) AS ExpressionValue
        ,ConnectionManagerID
        ,RetainSameConnectionProperty
    FROM CTE_PkgConLevel pkg;

    PRINT '---------------Get all connections-----------------------------------';
    PRINT '------------------------Get all variable details-------------------------------------';

    WITH CTE_PkgLevel
    AS (
        SELECT pkg.RowID
            ,pkg.PackagePath
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:ObjectName[1]', 'varchar(max)') AS VariableName
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:DTSID[1]', 'varchar(max)') AS VariableHexValue
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:Expression[1]', 'varchar(max)') AS ExpressionValue
            ,cfnodes.x.query('.').query('declare namespace p1="www.microsoft.com/SqlServer/Dts";./p1:Variable/p1:VariableValue') AS VariableQry
            ,PackageCreatorName
        FROM pkgStats pkg
        CROSS APPLY pkg.PackageXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts";(//DTS:Executable/DTS:Variables/*)') AS cfnodes(x)
        )
        --select * from CTE_PkgLevel
        ,CTE_PkgVarLevel
    AS (
        SELECT pkg.RowID
            ,pkg.PackagePath
            ,pkg.VariableName
            ,pkg.ExpressionValue
            ,VariableHexValue
            ,(
                SELECT TOP 1 cfnodes.x.value('.', 'nvarchar(max)') AS VariableValue
                FROM pkg.VariableQry.nodes('./*') AS cfnodes(x)
                ) AS VariableValue
            --,pkg.ConnectionStringQry
            ,(
                SELECT TOP 1 cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";@p1:DataType[1]', 'nvarchar(max)') AS DataType
                FROM pkg.VariableQry.nodes('./*') AS cfnodes(x)
                ) AS VariableDataType
            ,PackageCreatorName
        FROM CTE_PkgLevel pkg
        )
    INSERT INTO TblVariableDetails (
        RowID
        ,PackagePath
        ,PackageName
        ,Category
        ,PackageCreatorName
        ,ObjectName
        ,ObjectType
        ,ObjectValue
        ,ExpressionValue
        ,VariableHexValue
        )
    SELECT DISTINCT Tblvar.RowID
        ,Tblvar.PackagePath
        ,REPLACE(Tblvar.PackagePath, REPLACE(@Path, '*.dtsx', ''), '') PackageName
        ,'Variable' AS Category
        ,Tblvar.PackageCreatorName
        ,cast(Tblvar.VariableName AS VARCHAR(max)) AS TaskName
        ,cast(Tblvar.VariableDataType AS VARCHAR(max)) AS TaskType
        ,isnull(cast(Tblvar.VariableValue AS VARCHAR(max)), '') AS VariableValue
        ,isnull(cast(tblvar.ExpressionValue AS VARCHAR(max)), '') ExpressionValue
        ,VariableHexValue
    FROM CTE_PkgVarLevel Tblvar;

    INSERT INTO PackageAnalysis (
        RowID
        ,PackagePath
        ,PackageName
        ,Category
        ,PackageCreatorName
        ,ObjectName
        ,ObjectType
        ,DelayValidationPropertyValue
        ,ObjectValue
        ,ExpressionValue
        )
    SELECT DISTINCT Tblvar.RowID
        ,Tblvar.PackagePath
        ,PackageName
        ,'Variable' AS Category
        ,Tblvar.PackageCreatorName
        ,ObjectName
        ,ObjectType
        ,'NA' AS DelayValidationPropertyValue
        ,ObjectValue
        ,ExpressionValue
    FROM TblVariableDetails Tblvar;

    PRINT '------------------------Get all variable details-------------------------------------';

        PRINT '------------------------Get all parameter details-------------------------------------';

    WITH CTE_PkgLevel
    AS (
        SELECT pkg.RowID
            ,pkg.PackagePath
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:ObjectName[1]', 'varchar(max)') AS ParameterName
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:DTSID[1]', 'varchar(max)') AS ParameterHexValue
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:Expression[1]', 'varchar(max)') AS ExpressionValue
            ,cfnodes.x.query('.').query('declare namespace p1="www.microsoft.com/SqlServer/Dts";./p1:PackageParameter/p1:Property') AS ParameterQry
            ,PackageCreatorName
        FROM pkgStats pkg
        CROSS APPLY pkg.PackageXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts";(//DTS:Executable/DTS:PackageParameters/*)') AS cfnodes(x)
        )
        --select * from CTE_PkgLevel
        ,CTE_PkgVarLevel
    AS (
        SELECT pkg.RowID
            ,pkg.PackagePath
            ,pkg.ParameterName
            ,pkg.ExpressionValue
            ,ParameterHexValue
            ,(
                SELECT TOP 1 cfnodes.x.value('.', 'nvarchar(max)') AS ParameterValue
                FROM pkg.ParameterQry.nodes('./*') AS cfnodes(x)
                ) AS ParameterValue
            --,pkg.ConnectionStringQry
            ,(
                SELECT TOP 1 cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";@p1:DataType[1]', 'nvarchar(max)') AS DataType
                FROM pkg.ParameterQry.nodes('./*') AS cfnodes(x)
                ) AS ParameterDataType
            ,PackageCreatorName
        FROM CTE_PkgLevel pkg
        )
    INSERT INTO tblParameterDetails(
        RowID
        ,PackagePath
        ,PackageName
        ,Category
        ,PackageCreatorName
        ,ObjectName
        ,ObjectType
        ,ObjectValue
        ,ExpressionValue
        ,ParameterHexValue
        )
    SELECT DISTINCT Tblvar.RowID
        ,Tblvar.PackagePath
        ,REPLACE(Tblvar.PackagePath, REPLACE(@Path, '*.dtsx', ''), '') PackageName
        ,'Variable' AS Category
        ,Tblvar.PackageCreatorName
        ,cast(Tblvar.ParameterName AS VARCHAR(max)) AS TaskName
        ,cast(Tblvar.ParameterDataType AS VARCHAR(max)) AS TaskType
        ,isnull(cast(Tblvar.ParameterValue AS VARCHAR(max)), '') AS ParameterValue
        ,isnull(cast(tblvar.ExpressionValue AS VARCHAR(max)), '') ExpressionValue
        ,ParameterHexValue
    FROM CTE_PkgVarLevel Tblvar;

    INSERT INTO PackageAnalysis (
        RowID
        ,PackagePath
        ,PackageName
        ,Category
        ,PackageCreatorName
        ,ObjectName
        ,ObjectType
        ,DelayValidationPropertyValue
        ,ObjectValue
        ,ExpressionValue
        )
    SELECT DISTINCT Tblvar.RowID
        ,Tblvar.PackagePath
        ,PackageName
        ,'Parameter' AS Category
        ,Tblvar.PackageCreatorName
        ,ObjectName
        ,ObjectType
        ,'NA' AS DelayValidationPropertyValue
        ,ObjectValue
        ,ExpressionValue
    FROM tblParameterDetails Tblvar;

    PRINT '------------------------Get all parameter details-------------------------------------';
    PRINT '----------------Get  precedence constraint details------------------------------';

    WITH CTE_CFPrec
    AS (
        SELECT pkg.RowID
            ,pkg.PackagePath
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:From[1]', 'varchar(max)') AS TaskFrom
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:To[1]', 'nvarchar(max)') AS TaskTo
        --,dft.x.value('@refId[1]','varchar(max)')
        FROM pkgStats pkg
        CROSS APPLY pkg.PackageXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts";//DTS:Executable/DTS:PrecedenceConstraints/*') AS cfnodes(x)
        )
        ,CTE_DFTPrec
    AS (
        SELECT pkg.RowID
            ,pkg.PackagePath
            ,cfnodes.x.value('./@startId[1]', 'varchar(max)') AS TaskFrom
            ,cfnodes.x.value('./@endId[1]', 'nvarchar(max)') AS TaskTo
        --,dft.x.value('@refId[1]','varchar(max)')
        FROM pkgStats pkg
        CROSS APPLY pkg.PackageXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts";//DTS:Executable/DTS:ObjectData/pipeline/paths/*') AS cfnodes(x)
        )
    INSERT INTO TblPrecedenceConstraint (
        RowID
        ,PackagePath
        ,TaskFrom
        ,Taskto
        ,TaskType
        )
    SELECT RowID
        ,PackagePath
        ,TaskFrom
        ,TaskTo
        ,TaskType
    FROM (
        SELECT RowID
            ,PackagePath
            ,TaskFrom
            ,TaskTo
            ,'Control Flow' AS TaskType
        FROM CTE_CFPrec
        
        UNION ALL
        
        SELECT RowID
            ,PackagePath
            ,substring(TaskFrom, 1, charindex('.', TaskFrom) - 1) AS TaskFrom
            ,substring(TaskTo, 1, CHARINDEX('.', TaskTo) - 1)
            ,'Data Flow'
        FROM CTE_DFTPrec
        ) t;
    CREATE CLUSTERED INDEX CIX_TblPrecedenceConstraint ON TblPrecedenceConstraint (RowID);

    CREATE NONCLUSTERED INDEX NCIX_TblPrecedenceConstraint ON TblPrecedenceConstraint (
        TaskFrom
        ,TaskTo
        );
SELECT DISTINCT RowID,TaskFrom,IsParentLevel,Row_number() OVER (
            PARTITION BY  rowid ORDER BY level) level INTO #tempprecedence1
FROM
(
    SELECT  distinct t1.Rowid
        ,t1.TaskFrom
        ,1 AS isparentlevel
        , len(t1.TaskFrom) - len(replace(t1.TaskFrom, '\', '')) AS level         
    
    FROM TblPrecedenceConstraint t1
    LEFT JOIN TblPrecedenceConstraint t2 ON t1.rowid = t2.RowID
        AND t1.TaskFrom = t2.taskTo
    WHERE t2.taskto IS NULL 
)T
 

    CREATE CLUSTERED INDEX CIX_TblPrecedenceConstraint1 ON #tempprecedence1 (RowID);

    CREATE NONCLUSTERED INDEX NCIX_TblPrecedenceConstraint1 ON #tempprecedence1 (level);

    CREATE TABLE #tempprecedence2 (
        ROWID INT
        ,TaskFrom VARCHAR(1000)
        ,task VARCHAR(1000)
        ,parentlevel INT
        ,LEVEL INT
        );

    DECLARE @cntlevel INT
        ,@cnt INT = 1;

    SELECT @cntlevel = count(*)
    FROM #tempprecedence1;
    WHILE @cnt <= @cntlevel
    BEGIN
            ;

        WITH cte
        AS (
            SELECT rowid
                ,taskfrom
                ,taskfrom AS task
                ,LEVEL
                ,1 AS cnt
            FROM #tempprecedence1
            WHERE LEVEL = @cnt
            
            UNION ALL
            
            SELECT c.rowid
                ,c.taskfrom
                ,t.taskto
                ,LEVEL
                ,cnt + 1
            FROM TblPrecedenceConstraint t
            INNER JOIN cte c ON t.RowID = c.RowID
                AND c.task = t.taskfrom
            )
        INSERT INTO #tempprecedence2 (
            rowid
            ,taskfrom
            ,task
            ,parentlevel
            ,LEVEL
            )
        SELECT rowid
            ,taskfrom
            ,task
            ,@cnt
            ,cnt
        FROM cte;
        SELECT @cnt = @cnt + 1;
    END
    SELECT rowid
        ,task
        ,parentlevel
        ,LEVEL
        ,row_number() OVER (
            PARTITION BY rowid ORDER BY parentlevel
                ,LEVEL
            ) trank
    INTO #tempprecedence3
    FROM #tempprecedence2;
    CREATE CLUSTERED INDEX CIX_TblPrecedenceConstraint1 ON #tempprecedence3 (RowID);

    CREATE NONCLUSTERED INDEX NCIX_TblPrecedenceConstraint1 ON #tempprecedence3 (task);
  SELECT t.rowid
        ,isnull(t1.task,t.task) as task
        ,t.LEVEL tlevel
        ,isnull(max(t1.LEVEL),max(t.level)) level
        ,isnull(max(t1.trank),max(t.trank)) trank
    INTO #tempprecedence4
    FROM #tempprecedence3 t
    LEFT JOIN #tempprecedence3 t1 ON t.rowid = t1.rowid
        AND t1.task LIKE '%' + t.task + '\%'
    GROUP BY t.rowid
        ,t1.task
        ,t.task
        ,t.LEVEL
        --,t1.LEVEL
    ORDER BY LEVEL
        ,trank;
     
 
    --select t.rowid,t1.task,t.level tlevel,t1.level, (t1.trank) trank into #tempprecedence4
    --from #tempprecedence3 t
    --join #tempprecedence3 t1
    --on t.rowid = t1.rowid
    --and t1.task like '%'+t.task+'%'
    -- order by trank

    SELECT t.rowid
        ,t.task
        ,replace(replace(replace((
                        SELECT   tlevel
                        FROM #tempprecedence4 t1
                        WHERE t1.rowid = t.rowid
                            AND t1.task = t.task
                        FOR XML path('') 
                        ), '</tlevel><tlevel>', '/'), '</tlevel>', '/'), '<tlevel>', '')  sequenceno,trank
    INTO #tempprecedence5
    FROM #tempprecedence4 t
    GROUP BY t.rowid
        ,t.task
        ,t.trank
    ORDER BY rowid
        ,trank;
 
  
 SELECT rowid,task, sequenceno, cast('/1/'+sequenceno+ cast(trank as varchar)+'/' as hierarchyid)rid into #tempprecedence5_Hierarchy FROM #tempprecedence5
    SELECT rowid
        ,task
        ,row_number() OVER (
            PARTITION BY rowid ORDER BY rid
            ) sequenceno
    INTO #tempprecedence6
    FROM #tempprecedence5_Hierarchy;
    CREATE CLUSTERED INDEX CIX_TblPrecedenceConstraint1 ON #tempprecedence6 (RowID);

    CREATE NONCLUSTERED INDEX NCIX_TblPrecedenceConstraint1 ON #tempprecedence6 (task);
    /*

   select t1.task,t1.parentlevel,t.task as t1,row_number() over(partition by t1.rowid order by t.level) level,t.rowid into #tempprecedence3
  from #tempprecedence2 t
  join #tempprecedence2 t1
  on charindex(t.task, t1.taskFrom)>0  
  and t1.parentlevel >1 and t.parentlevel =1
  and t.rowid =t1.rowid
    order by t.rowid, t1.parentlevel ,t.level 

     select  rowid, task,row_number() over(partition by rowid order by max(sequenceno)) sequenceno into #tempprecedence4
  from(
    select distinct t1.rowid,isnull(t2.task,t1.task) Task,row_number() over(partition by t1.rowid order by t1.parentlevel,t1.level,isnull(t2.level,1)) sequenceno  
  from #tempprecedence2 t1
  left join #tempprecedence3 t2
  on t1.rowid = t2.rowid
  and t1.task = t2.t1
   where t1.parentlevel =1  )t
   group by rowid,task 

   
 */
    PRINT '----------------Get  precedence constraint details------------------------------';
    PRINT '----------------Get all Control flow tasks details------------------------------';
    PRINT '----------------Get all  data flow tasks details------------------------------';

    WITH CTE_CFLevel
    AS (
        SELECT pkg.RowID
            ,cfnodes.x.query('.').query('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
                    ./DTS:Executable[@DTS:ExecutableType=''SSIS.Pipeline.3'']/DTS:ObjectData/pipeline/components/component') DFTQuery
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:refId[1]', 'varchar(max)') AS TaskPath
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:ObjectName[1]', 'nvarchar(max)') AS TaskName
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:Description', 'nvarchar(max)') AS TaskTypeDescription
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:ExecutableType', 'nvarchar(max)') AS TaskType
            ,cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:DelayValidation', 'nvarchar(max)') AS DelayValidationPropertyValue
            ,ISNULL(cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:Disabled', 'nvarchar(max)'), 'False') AS IsDisabled
            ,'EvalExpression = ' + cfnodes.x.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";./@p1:EvalExpression', 'nvarchar(max)') AS ForloopEvalExpression
            ,cfnodes.x.query('.').query('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
                    ./DTS:Executable[@DTS:ExecutableType=''Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask, Microsoft.SqlServer.SQLTask, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'']/DTS:ObjectData/*') AS SqlTaskQry
            ,cfnodes.x.query('.').query('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
                    ./DTS:Executable[@DTS:ExecutableType=''SSIS.ExecutePackageTask.3'']/*') ExecPkgTaskQry
            ,cfnodes.x.query('.').query('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
                    ./DTS:Executable[@DTS:ExecutableType=''Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptTask, Microsoft.SqlServer.ScriptTask, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'']/DTS:ObjectData/ScriptProject/*') ScriptTaskQry
        FROM pkgStats pkg
        CROSS APPLY pkg.PackageXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts";//DTS:Executable/DTS:Executables/*') AS cfnodes(x)
        )
    INSERT INTO TblControlFlowDetails (
        RowID
        ,TaskPath
        ,TaskName
        ,TaskTypeDescription
        ,TaskType
        ,DelayValidationPropertyValue
        ,DFTQuery
        ,SqlTaskQry
        ,ExecPkgTaskQry
        ,ScriptTaskQry
        ,IsDisabled
        ,ExpressionValue
        )
    SELECT RowID
        ,TaskPath
        ,TaskName
        ,TaskTypeDescription
        ,TaskType
        ,DelayValidationPropertyValue
        ,DFTQuery
        ,SqlTaskQry
        ,ExecPkgTaskQry
        ,ScriptTaskQry
        ,IsDisabled
        ,ForloopEvalExpression
    FROM CTE_CFLevel;

    PRINT '---------- Insert Script task details-----------------------';

    INSERT INTO TblScriptTaskdetails (
        RowID
        ,ControlFlowDetailsRowID
        ,Script
        )
    SELECT RowID
        ,CF.ControlFlowDetailsRowID
        ,cfnodes1.x.value('./ProjectItem[@Name=''ScriptMain.cs''][1]', 'varchar(max)') Script
    FROM TblControlFlowDetails cf
    CROSS APPLY Cf.ScriptTaskQry.nodes('.') AS cfnodes1(x);

    PRINT '---------- Insert Execute package task details-----------------------';

    INSERT INTO TblExecutePackageTaskDetails (
        RowID
        ,ControlFlowDetailsRowID
        ,ExecutePackageExpression
        ,ExecutedPackageName
        ,ExecutePackageConnection
        )
    SELECT RowID
        ,cf.ControlFlowDetailsRowID
        ,cfnodes1.x.value('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
                    ./DTS:PropertyExpression[1]', 'varchar(1000)') ExecutePackageExpression
        ,cfnodes1.x.value('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
            (./DTS:ObjectData/ExecutePackageTask/PackageName)[1]', 'varchar(1000)') ExecutedPackageName
        ,cfnodes1.x.value('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
            (./DTS:ObjectData/ExecutePackageTask/Connection)[1]', 'varchar(1000)') ExecutePackageConnection
    FROM TblControlFlowDetails cf
    CROSS APPLY Cf.ExecPkgTaskQry.nodes('.') AS cfnodes1(x);

    UPDATE execpkg
    SET ExecutePackageConnection = pkg.ObjectValue
    FROM TblExecutePackageTaskDetails execpkg
    INNER JOIN packageanalysis pkg ON execpkg.RowID = pkg.RowID
        AND pkg.category = 'Connection'
        AND pkg.ConnectionManagerID = execpkg.ExecutePackageConnection;

    PRINT '---------- Insert Execute SQL task details-----------------------';

    INSERT INTO TblSQLTaskDetails (
        RowID
        ,ControlFlowDetailsRowID
        ,ParameterBindingSequence
        ,ParameterBindingParameterName
        )
    SELECT DISTINCT cf.RowID
        ,cf.ControlFlowDetailsRowID
        --,cfnodes1.x.value('declare namespace SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask"; (./@SQLTask:DtsVariableName)','varchar(1000)') as ResultSetParameterName
        ,cfnodes.x.value('declare namespace SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask"; (./@SQLTask:ParameterName)', 'varchar(1000)') AS ParameterBindingSequence
        ,cfnodes.x.value('declare namespace SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask"; (./@SQLTask:DtsVariableName)', 'varchar(1000)') AS ParameterBindingParameterName
    FROM TblControlFlowDetails cf
    OUTER APPLY Cf.SqlTaskQry.nodes('declare namespace SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask";./SQLTask:SqlTaskData/SQLTask:ParameterBinding') AS cfnodes(x)
    ORDER BY 1
        ,2
        ,3;

    UPDATE sqltsk
    SET ResultSetParameterName = CF.ResultSetParameterName
    FROM TblSQLTaskDetails sqltsk
    INNER JOIN (
        SELECT DISTINCT cf.RowID
            ,cf.ControlFlowDetailsRowID
            ,cast(ROW_NUMBER() OVER (
                    PARTITION BY cf.ControlFlowDetailsRowID ORDER BY (
                            SELECT 1
                            )
                    ) - 1 AS VARCHAR) rid
            ,cfnodes1.x.value('declare namespace SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask"; (./@SQLTask:DtsVariableName)', 'varchar(1000)') AS ResultSetParameterName
        FROM TblControlFlowDetails cf
        OUTER APPLY Cf.SqlTaskQry.nodes('declare namespace SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask";./SQLTask:SqlTaskData/SQLTask:ResultBinding') AS cfnodes1(x)
        ) CF ON sqltsk.ControlFlowDetailsRowID = CF.ControlFlowDetailsRowID
        AND cf.rid = ISNULL(sqltsk.ParameterBindingSequence, 0)

    PRINT '---------- Insert DFT details-----------------------';

    INSERT INTO TblDFTTaskDetails (
        RowID
        ,DFTTasksPath
        ,DFTTaskName
        ,DFTTaskType
        ,DFTTaskType1
        ,DFTRowSet
        ,ParameterBindingParameterName
        ,DFTSQLCommand
        ,DFTConnectionManager
        ,Variable
        ,IsSortedProperty
        ,InputQry
        ,OutputQry
        ,MultihashcolumnSortPosition
        )
    SELECT RowID
        ,dftnodes.x.value('@refId[1]', 'varchar(max)') AS DFTTasksPath
        ,dftnodes.x.value('@name[1]', 'varchar(max)') AS DFTTaskName
        ,dftnodes.x.value('@description[1]', 'varchar(max)') AS DFTTaskType
        ,dftnodes.x.value('@contactInfo[1]', 'varchar(max)') AS DFTTaskType1
        ,dftnodes.x.value('data(./properties/property[@name=''OpenRowset''] )[1]', 'varchar(max)') DFTRowSet
        ,dftnodes.x.value('data(./properties/property[@name=''ParameterMapping'']   )[1]', 'varchar(max)') ParameterBindingParameterName
        ,CASE 
            WHEN isnull(dftnodes.x.value('data(./properties/property[@name=''SqlCommand''])[1]', 'varchar(max)'), '') = ''
                THEN isnull(dftnodes.x.value('data(./properties/property[@name=''SqlCommandVariable''])[1]', 'varchar(max)'), '')
            ELSE isnull(dftnodes.x.value('data(./properties/property[@name=''SqlCommand''])[1]', 'varchar(max)'), '')
            END DFTSQLCommand
        ,dftnodes.x.value('data(./connections/connection/@connectionManagerID)[1]', 'varchar(max)') DFTConnectionManager
        ,dftnodes.x.value('data(./properties/property[@name=''VariableName'']   )[1]', 'varchar(max)') Variable
        ,dftnodes.x.value('data(./outputs/output/@isSorted)[1]', 'varchar(10)') IsSortedProperty

        ,lineage.x.query('.') InputQry
        ,outputvalue.x.query('.') OutputQry
        ,outputvalue.x.value('data(./properties/property[@name=''InputColumnLineageIDs'']   )[1]', 'varchar(max)')  as MultihashcolumnSortPosition

    FROM TblControlFlowDetails pkglvl
    CROSS APPLY pkglvl.DFTQuery.nodes('./*') AS dftnodes(x)
    OUTER APPLY dftnodes.x.nodes('./inputs/input/inputColumns/*') AS lineage(x)
    OUTER APPLY dftnodes.x.nodes('./outputs/output/outputColumns/*') AS outputvalue(x);

    PRINT '---------- Insert DFT details-----------------------';
    PRINT '---------- Insert DFT Source and destination details-----------------------';

    INSERT INTO TblSrcDestDetails (
        RowID
        ,DataFlowDetailsRowID
        ,SourceColumn
        ,DestinationColumn
        ,SortKeyPosition
        )
    SELECT RowID
        ,DataFlowDetailsRowID
        ,lineage.x.value('./@lineageId[1]', 'varchar(max)') AS SourceColumn
        ,COALESCE(lineage.x.value('./@name[1]', 'varchar(max)'),lineage.x.value('./@externalMetadataColumnId[1]', 'varchar(max)'), lineage.x.value('./@refId[1]', 'varchar(max)')) DestinationColumn
        ,lineage.x.value('./@sortKeyPosition[1]', 'varchar(200)') SortKeyPosition
        
    FROM TblDFTTaskDetails pkglvl
    CROSS APPLY pkglvl.InputQry.nodes('./*') AS lineage(x);

    INSERT INTO TblSrcDestDetails (
        RowID
        ,DataFlowDetailsRowID
        ,SourceColumn
        ,DestinationColumn
        ,SortKeyPosition
        )
    SELECT RowID
        ,DataFlowDetailsRowID
        ,lineage.x.value('./@lineageId[1]', 'varchar(max)') SourceColumn
        ,COALESCE(lineage.x.value('./@name[1]', 'varchar(max)'),lineage.x.value('./@externalMetadataColumnId[1]', 'varchar(max)'), lineage.x.value('./@refId[1]', 'varchar(max)')) DestinationColumn
        ,lineage.x.value('./@sortKeyPosition[1]', 'varchar(200)') SortKeyPosition
    FROM TblDFTTaskDetails pkglvl
    CROSS APPLY pkglvl.OutputQry.nodes('./*') AS lineage(x);

    PRINT '---------- Insert DFT Source and destination details-----------------------';
    PRINT '---------- Insert DFT Derived task  details-----------------------';

    INSERT INTO TblDerivedTaskDetails (
        RowID
        ,DataFlowDetailsRowID
        ,DerivedValue
        ,SourceColumn
        ,DestinationColumn
        )
    SELECT DISTINCT RowID
        ,DataFlowDetailsRowID
        ,ISNULL(inputvalue.x.value('data(./properties/property[@description =''Derived Column Friendly Expression''])[1]', 'varchar(max)'), inputvalue.x.value('data(./properties/property[@name =''FriendlyExpression''])[1]', 'varchar(max)')) DerivedValue
        ,inputvalue.x.value('./@lineageId[1]', 'varchar(max)') SourceColumn
        ,inputvalue.x.value('./@refId[1]', 'varchar(max)') DestinationColumn
    FROM TblDFTTaskDetails pkglvl
    CROSS APPLY pkglvl.InputQry.nodes('./*') AS inputvalue(x)
    
    UNION ALL
    
    SELECT DISTINCT RowID
        ,DataFlowDetailsRowID
        ,ISNULL(outputvalue.x1.value('data(./properties/property[@description =''Derived Column Friendly Expression''])[1]', 'varchar(max)'), outputvalue.x1.value('data(./properties/property[@name =''FriendlyExpression''])[1]', 'varchar(max)')) DerivedValue
        ,outputvalue.x1.value('./@lineageId[1]', 'varchar(max)') SourceColumn
        ,outputvalue.x1.value('./@refId[1]', 'varchar(max)') DestinationColumn
    FROM TblDFTTaskDetails pkglvl
    CROSS APPLY pkglvl.OutputQry.nodes('./*') AS outputvalue(x1)
    WHERE DFTTASKTYPE1 LIKE '%DERIVED%';

    PRINT '---------- Insert DFT Derived task  details-----------------------';
    PRINT '---------- Insert DFT lookup task  details-----------------------';

    INSERT INTO TblLookupTaskDetails (
        RowID
        ,DataFlowDetailsRowID
        ,LookupJoins
        ,SourceColumn
        ,DestinationColumn
        )
    SELECT RowID
        ,DataFlowDetailsRowID
        ,outputvalue.x.value('./@lineageId[1]', 'varchar(max)') + '----->' + outputvalue.x.value('data(./properties/property[@name =''JoinToReferenceColumn''])[1]', 'varchar(max)') LookupJoins
        ,outputvalue1.x.value('data(./properties/property[@name =''CopyFromReferenceColumn''])[1]', 'varchar(max)') SourceColumn
        ,outputvalue1.x.value('./@refId[1]', 'varchar(max)') DestinationColumn
    FROM TblDFTTaskDetails pkglvl
    CROSS APPLY pkglvl.InputQry.nodes('./*') AS outputvalue(x)
    CROSS APPLY pkglvl.OutputQry.nodes('./*') AS outputvalue1(x)
    WHERE DFTTaskType = 'Lookup'
        OR DFTTaskType1 LIKE '%Lookup%';

    DELETE
    FROM TblLookupTaskDetails
    WHERE DestinationColumn LIKE '%Lookup Error Output%';
    PRINT '---------- Insert DFT lookup task  details-----------------------';
    PRINT '---------- Insert DFT  details in final table-----------------------';

    INSERT INTO PackageAnalysis (
        RowID
        ,PackagePath
        ,PackageName
        ,Category
        ,PackageCreatorName
        ,TaskPath
        ,ObjectName
        ,ObjectType
        ,ObjectTypeDescription
        ,DelayValidationPropertyValue
        ,ObjectValue
        ,ExpressionValue
        ,ConnectionManager
        ,SourceColumn
        ,DestinationColumn
        ,DerivedValue
        ,Variable
        ,LookupJoins
        ,ParameterBindingParameterName
        ,SortKeyPosition
        ,IsSortedProperty
        ,MultihashcolumnSortPosition
        )
    SELECT DISTINCT dftlvl.RowID
        ,Pkg.PackagePath
        ,REPLACE(pkg.PackagePath, REPLACE(@Path, '*.dtsx', ''), '') PackageName
        ,cast('Data Flow Task' AS VARCHAR(max)) AS Category
        ,pkg.PackageCreatorName
        ,DFTLVL.DFTTasksPath AS TaskPath
        ,DFTTaskName AS TaskName
        ,CASE 
            WHEN cast(CHARINDEX(';', LEFT(DFTTaskType1, 8000)) AS VARCHAR(1000)) BETWEEN 4
                    AND 100
                THEN LEFT(cast(DFTTaskType1 AS VARCHAR(8000)), CHARINDEX(';', LEFT(DFTTaskType1, 8000)) - 1)
            ELSE DFTTaskType1
            END AS TaskType
        ,cast('' AS VARCHAR(max)) AS ObjectTypeDescription
        ,'NA' AS DelayValidationPropertyValue
        ,CASE 
            WHEN ISNULL(DFTlvl.DFTSQLCommand, '') <> ''
                THEN ISNULL(DFTlvl.DFTSQLCommand, '')
            ELSE ISNULL(DFTlvl.DFTRowSet, '')
            END AS ConnectionString
        ,cast('' AS VARCHAR(max)) AS ExpressionValue
        ,DFTConnectionManager AS ConnectionManager
        ,ISNULL(Der.SourceColumn, SrcDest.SourceColumn)
        ,ISNULL(Der.DestinationColumn, SrcDest.DestinationColumn)
        ,Der.DerivedValue
        ,Variable
        ,Lkup.LookupJoins
        ,DFTlvl.ParameterBindingParameterName
        ,SrcDest.SortKeyPosition
        ,DFTlvl.IsSortedProperty
        ,DFTlvl.MultihashcolumnSortPosition
    FROM TblDFTTaskDetails DFTlvl
    INNER JOIN pkgStats PKG ON DFTlvl.RowID = Pkg.RowID
    LEFT JOIN TblSrcDestDetails SrcDest ON DFTlvl.RowID = SrcDest.RowID
        AND DFTlvl.DataFlowDetailsRowID = SrcDest.DataFlowDetailsRowID
    LEFT JOIN TblDerivedTaskDetails Der ON DFTlvl.RowID = Der.RowID
        AND DFTlvl.DataFlowDetailsRowID = Der.DataFlowDetailsRowID
    LEFT JOIN TblLookupTaskDetails Lkup ON DFTlvl.RowID = Lkup.RowID
        AND DFTlvl.DataFlowDetailsRowID = Lkup.DataFlowDetailsRowID;

         
    PRINT '---------- Insert DFT  details in final table-----------------------';
    PRINT '-------------Insert control flow details in final table----------';

    INSERT INTO PackageAnalysis (
        RowID
        ,PackagePath
        ,PackageName
        ,Category
        ,PackageCreatorName
        ,TaskPath
        ,ObjectName
        ,ObjectType
        ,ObjectTypeDescription
        ,DelayValidationPropertyValue
        ,ObjectValue
        ,ResultSetParameterName
        ,ParameterBindingSequence
        ,ParameterBindingParameterName
        ,ExecutePackageExpression
        ,ExecutedPackageName
        ,ExecutePackageConnection
        ,Script
        ,ConnectionManagerID
        ,IsDisabled
        ,ExpressionValue
        )
    SELECT cflvl.RowID
        ,Pkg.PackagePath
        ,REPLACE(Pkg.PackagePath, REPLACE(@Path, '*.dtsx', ''), '') PackageName
        ,cast('Control Flow Task' AS VARCHAR(max)) AS Category
        ,Pkg.PackageCreatorName
        ,cflvl.TaskPath
        ,CAST(cflvl.TaskName AS VARCHAR(max)) AS TaskName
        ,CAST(TaskType AS VARCHAR(max)) AS TaskType
        ,cast(cflvl.TaskTypeDescription AS VARCHAR(max)) AS ObjectTypeDescription
        ,ISNULL(NULLIF(DelayValidationPropertyValue, ''), 'False') DelayValidationPropertyValue
        ,(
            SELECT TOP 1 cfnodes.x.value('declare namespace SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask";@SQLTask:SqlStatementSource[1]', 'nvarchar(max)') AS ConnectionString
            FROM cflvl.SqlTaskQry.nodes('./*') AS cfnodes(x)
            ) AS ConnectionString
        ,SQLTask.ResultSetParameterName
        ,SQLTask.ParameterBindingSequence
        ,SQLTask.ParameterBindingParameterName
        ,ExecPkgTask.ExecutePackageExpression
        ,ExecPkgTask.ExecutedPackageName
        ,ExecPkgTask.ExecutePackageConnection
        ,ScriptTsk.Script
        ,(
            SELECT TOP 1 cfnodes.x.value('declare namespace SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask";@SQLTask:Connection[1]', 'nvarchar(max)') AS ConnectionString
            FROM cflvl.SqlTaskQry.nodes('./*') AS cfnodes(x)
            ) AS ConnectionString
        ,ISNULL(cflvl.IsDisabled, 'False')
        ,cflvl.ExpressionValue
    FROM TblControlFlowDetails cflvl
    INNER JOIN pkgStats PKG ON cflvl.RowID = Pkg.RowID
    LEFT JOIN TblSQLTaskDetails SQLTask ON cflvl.RowID = SQLTask.RowID
        AND cflvl.ControlFlowDetailsRowID = SQLTask.ControlFlowDetailsRowID
    LEFT JOIN TblExecutePackageTaskDetails ExecPkgTask ON cflvl.RowID = ExecPkgTask.RowID
        AND cflvl.ControlFlowDetailsRowID = ExecPkgTask.ControlFlowDetailsRowID
    LEFT JOIN TblScriptTaskdetails ScriptTsk ON cflvl.RowID = ScriptTsk.RowID
        AND cflvl.ControlFlowDetailsRowID = ScriptTsk.ControlFlowDetailsRowID;

    PRINT '-------------Insert control flow details in final table----------';
    PRINT '-------------Insert Connection details in  table----------';

    INSERT INTO ConnectionDetails (
        ConnectionManager
        ,ConnectionManagerID
        )
    SELECT DISTINCT ObjectName
        ,ConnectionManagerID
    FROM PackageAnalysis
    WHERE Category = 'Connection';

    PRINT '-------------Insert Connection  details in  table----------';
    PRINT '-------------Update sequence of task----------';

    UPDATE PA
    SET SequenceNo = TblPrecCon.sequenceno
    FROM PackageAnalysis PA
    INNER JOIN #tempprecedence6 TblPrecCon ON PA.RowID = TblPrecCon.RowID
        AND PA.TaskPath = TblPrecCon.Task;

    --LEFT JOIN @TblPrecedenceConstraint1 TblPrec
    --ON Final.RowID = TblPrec.RowID
    --AND Final.PackagePath = TblPrec.PackagePath
    --AND Final.TaskPath = TblPrec.TaskName
    --ORDER BY TblPrec.RowID,TblPrec.PrecOrder
    PRINT '--------------------update objecttype-------------------';

    UPDATE PackageAnalysis
    SET ObjectType = 'Sequence Container'
    WHERE ObjectType LIKE '%STOCK:SEQUENCE%'
        OR ObjectType LIKE '%(Sequence Container)%'
        OR ObjectType LIKE '%(Container)%';

    UPDATE PackageAnalysis
    SET ObjectType = 'Data Flow Task'
    WHERE ObjectType LIKE 'SSIS.Pipeline.3'
        OR ObjectType LIKE '%(Data Flow Task)%';

    UPDATE PackageAnalysis
    SET ObjectType = 'For Loop Container'
    WHERE ObjectType LIKE '%(For Loop Container)%'
        OR ObjectType LIKE 'STOCK:FORLOOP';

    UPDATE PackageAnalysis
    SET ObjectType = 'Script Task'
    WHERE ObjectType LIKE '%(Script Task)%';

    UPDATE PackageAnalysis
    SET ObjectType = 'Execute SQL Task'
    WHERE ObjectType LIKE '%(Execute SQL Task)%'
        OR ObjectType LIKE '%ExecuteSQLTask%';

    UPDATE PackageAnalysis
    SET ObjectType = 'Execute Package Task'
    WHERE ObjectType LIKE '%(Execute Package Task)%'
        OR ObjectType LIKE '%ExecutePackageTask%';

    UPDATE PackageAnalysis
    SET ObjectType = 'Foreach Loop Container'
    WHERE ObjectType LIKE '%(Foreach Loop Container)%'
        OR ObjectType LIKE 'STOCK:FOREACHLOOP';

    UPDATE PackageAnalysis
    SET ObjectType = 'File System Task'
    WHERE ObjectType LIKE '%FileSystemTask%';

    UPDATE PackageAnalysis
    SET ObjectType = 'Script Task'
    WHERE ObjectType LIKE '%ScriptTask%';

    UPDATE PackageAnalysis
    SET ObjectType = 'Send Mail Task'
    WHERE ObjectType LIKE '%SendMailTask%';

    UPDATE PackageAnalysis
    SET ObjectType = 'ADO.NET:System.Data.SqlClient.SqlConnection'
    WHERE objecttype = 'ADO.NET:System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089';

    UPDATE PackageAnalysis
    SET ObjectType = 'ADO.NET:System.Data.Odbc.OdbcConnection'
    WHERE objecttype = 'ADO.NET:System.Data.Odbc.OdbcConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089';

    UPDATE PackageAnalysis
    SET ObjectType = 'Script Component'
    WHERE ObjectType LIKE 'Hosts user-defined data transformations, source and destination adapters'
        OR ObjectType = 'Executes a custom script.';

    UPDATE PackageAnalysis
    SET ObjectType = 'INT16'
    WHERE objecttype = '2' --OR objecttype = '0'
        ;

    UPDATE PackageAnalysis
    SET ObjectType = 'INT32'
    WHERE objecttype = '3';

    UPDATE PackageAnalysis
    SET ObjectType = 'BYTE'
    WHERE objecttype = '17';

    UPDATE PackageAnalysis
    SET ObjectType = 'BOOLEAN'
    WHERE objecttype = '11';

    UPDATE PackageAnalysis
    SET ObjectType = 'OBJECT'
    WHERE objecttype = '13';

    UPDATE PackageAnalysis
    SET ObjectType = 'STRING'
    WHERE objecttype = '8';

    UPDATE PackageAnalysis
    SET ObjectType = 'DOUBLE'
    WHERE objecttype = '5';

    UPDATE PackageAnalysis
    SET ObjectType = 'DATETIME'
    WHERE objecttype = '7';

    UPDATE PackageAnalysis
    SET ObjectType = 'INT64'
    WHERE objecttype = '20';

    UPDATE PackageAnalysis
    SET ObjectType = 'ADO NET Source'
    WHERE objecttype = 'Extracts data from a relational database by using a .NET provider.';

    UPDATE PackageAnalysis
    SET ObjectValue = Variable
    WHERE objecttype = 'Row count';

    UPDATE PackageAnalysis
    SET PackageAnalysis.ConnectionManager = ConnectionDetails.ConnectionManager
    FROM PackageAnalysis
    INNER JOIN ConnectionDetails ON PackageAnalysis.ConnectionManagerID = ConnectionDetails.ConnectionManagerID;

    UPDATE PackageAnalysis
    SET PackageAnalysis.IsDisabled = ISNULL(IsDisabled, 'False');


    DELETE
    FROM PackageAnalysis
    WHERE SourceColumn LIKE '%OLE DB Source Error Output%'
    AND (ObjectType LIKE '%Source%' OR ObjectType LIKE '%Destination%');


    DELETE
    FROM PackageAnalysis
    WHERE SourceColumn LIKE '%Derived Column Error Output%';

    DECLARE @tblparameters TABLE (
        rowid INT
        ,ParameterBindingParameterName VARCHAR(1000)
        ,taskpath VARCHAR(2000)
        ,SplitParameterBindingParameterName VARCHAR(1000)
        ,NewParameterBindingParameterName VARCHAR(1000)
        );

    INSERT INTO @tblparameters (
        rowid
        ,ParameterBindingParameterName
        ,taskpath
        ,SplitParameterBindingParameterName
        )
    SELECT DISTINCT rowid
        ,ParameterBindingParameterName
        ,taskpath
        ,O.ParameterBindingParameterNameSplit
    FROM (
        SELECT rowid
            ,ParameterBindingParameterName
            ,taskpath
            ,cast('<X>' + replace(ParameterBindingParameterName, ';', '</X><X>') + '</X>' AS XML) AS ParameterBindingParameterNameSep
        FROM PackageAnalysis
        WHERE Category = 'Data Flow Task'
            AND ParameterBindingParameterName IS NOT NULL
        ) F1
    CROSS APPLY (
        SELECT fdata.D.value('.', 'varchar(1000)') AS ParameterBindingParameterNameSplit
        FROM f1.ParameterBindingParameterNameSep.nodes('X') AS fdata(D)
        ) O
    WHERE O.ParameterBindingParameterNameSplit <> '';

    UPDATE P
    SET P.NewParameterBindingParameterName = REPLACE(SplitParameterBindingParameterName, V.VariableHexValue, 'VariableName = ' + V.ObjectName) + ',Value = ' + v.ObjectValue
    FROM @tblparameters P
    INNER JOIN TblVariableDetails v ON P.Rowid = v.Rowid
        AND CHARINDEX(V.VariableHexValue, SplitParameterBindingParameterName) > 0;

    UPDATE p
    SET ParameterBindingParameterName = t.NewParameterBindingParameterName
    FROM packageanalysis p
    INNER JOIN (
        SELECT rowid
            ,taskpath
            ,ParameterBindingParameterName
            ,stuff((
                    SELECT ';' + NewParameterBindingParameterName
                    FROM @tblparameters
                    WHERE rowid = t.rowid
                        AND taskpath = t.taskpath
                    FOR XML PATH('')
                        ,TYPE
                        ,ROOT
                    ).value('root[1]', 'nvarchar(max)'), 1, 1, '') AS NewParameterBindingParameterName
        FROM @tblparameters t
        ) t ON p.rowid = t.rowid
        AND p.taskpath = t.taskpath
        AND p.ParameterBindingParameterName = t.ParameterBindingParameterName

    CREATE NONCLUSTERED INDEX NCIX ON PackageAnalysis (
        Rowid
        ,SequenceNo
        );



    UPDATE pkg
    SET PackageSequenceNo = NewTableRowID
    FROM PackageAnalysis pkg
    JOIN 
    (SELECT  ROW_number() OVER(PARTITION BY RowID ORDER BY ISNULL(SequenceNo,-1)) as NewTableRowID,      
                SequenceNo                         ,  
                RowID,
                TableRowID
    FROM PackageAnalysis   ) newpkg
    ON pkg.RowID = newpkg.RowID
    and pkg.TableRowID = newpkg.TableRowID

    UPDATE pkg
    SET PackageProtectionLevel = CASE WHEN Stats.PackageProtectionLevel IS Null THEN 'EncryptSensitiveWithUserKey'
                                        WHEN Stats.PackageProtectionLevel = '0' THEN 'DontSaveSensitive'
                                        WHEN Stats.PackageProtectionLevel = '2' THEN 'EncryptSensitiveWithPassword'
                                        ELSE Stats.PackageProtectionLevel END
    FROM PackageAnalysis pkg
    JOIN pkgStats Stats
    ON pkg.RowID = Stats.RowID
     
    SELECT  
                RowID                              ,  
                PackageSequenceNo ,      
                SequenceNo                         ,  
            '"'+    PackagePath                          +'"' PackagePath,  
            '"'+    PackageName                          +'"' PackageName,  
            '"'+    ISNULL(IsDisabled,'')                           +'"' IsDisabled,  

            '"'+    ISNULL(Category                         ,'')     +'"' Category,  
            '"'+    ISNULL(PackageCreatorName               ,'')     +'"' PackageCreatorName,  
            '"'+    ISNULL(PackageProtectionLevel           ,'')    +'"' PackageProtectionLevel,
            '"'+    ISNULL(TaskPath                         ,'')     +'"' TaskPath,  
            '"'+    ISNULL(ObjectName                       ,'')     +'"' ObjectName,  
            '"'+    ISNULL(ObjectType                       ,'')     +'"' ObjectType,  
            '"'+    ISNULL(ObjectTypeDescription            ,'')     +'"' ObjectTypeDescription,  
            '"'+    ISNULL(DelayValidationPropertyValue     ,'')     +'"' DelayValidationPropertyValue,  
            '"'+    ISNULL(ObjectValue                      ,'')     +'"' ObjectValue,  
            '"'+    ISNULL(RetainSameConnectionProperty                      ,'')     +'"' RetainSameConnectionProperty,  
            
            '"'+    ISNULL(IsSortedProperty                 ,'')     +'"' IsSortedProperty,  
            '"'+    ISNULL(ExpressionValue                  ,'')     +'"' ExpressionValue,  
            '"'+    ISNULL(ConnectionManager                ,'')     +'"' ConnectionManager,  
            '"'+    ISNULL(SourceColumn                     ,'')     +'"' SourceColumn,  
            '"'+    ISNULL(DestinationColumn                ,'')     +'"' DestinationColumn,  
            '"'+    ISNULL(SortKeyPosition                  ,'')     +'"' SortKeyPosition,  
            '"'+    ISNULL(MultihashcolumnSortPosition                  ,'')     +'"' MultihashcolumnSortPosition,  
            
            '"'+    ISNULL(DerivedValue                     ,'')     +'"' DerivedValue,  
            '"'+    ISNULL(ResultSetParameterName           ,'')     +'"' ResultSetParameterName,  
            '"'+    ISNULL(ParameterBindingSequence         ,'')     +'"' ParameterBindingSequence,  
            '"'+    ISNULL(ParameterBindingParameterName    ,'')     +'"' ParameterBindingParameterName,  
            '"'+    ISNULL(ExecutePackageExpression         ,'')     +'"' ExecutePackageExpression,  
            '"'+    ISNULL(ExecutedPackageName              ,'')     +'"' ExecutedPackageName,  
            '"'+    ISNULL(ExecutePackageConnection         ,'')     +'"' ExecutePackageConnection,  
            '"'+    ISNULL(Script                           ,'')     +'"' Script,  
            '"'+    ISNULL(Variable                         ,'')     +'"' Variable,  
            '"'+    ISNULL(LookupJoins                      ,'')     +'"' LookupJoins
    FROM PackageAnalysis
    ORDER BY 3
        ,1;
END;
GO