Similar to my post of a few years ago where you may want to search an SSRS package (Querying Information from Deployed SSRS Packages) you can also search SSIS. The big differences are the namespaces used and that sometimes the package isn’t actually in a database to be queried. This example should show at least one way to get around each problem.
-- This tells you exactly where in a package a query containing the search criteria (@F) can be found.
-- Be careful in your specification of table/column names as wildcards and patterns are not allowed
-- and some references are generated as [schema].[name] while others are just schema.name.
Declare @F varchar(100) = 'TextToFind'; With XMLNAMESPACES(N'www.microsoft.com/SqlServer/Dts' AS DTS ,N'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask ,N'http://www.w3.org/2001/XMLSchema' AS xsd ,N'urn:schemas-microsoft-com:xml-msdata' AS msdata) , FileData AS (select cast( [SSISPkgData].BulkColumn AS XML) AS pkgXML from openrowset(bulk 'H:\SomePackage.dtsx',single_blob) as [SSISPkgData]) , Found as ( select Nodes.value('@SQLTask:SqlStatementSource','varchar(MAX)') Txt -- Notice this very cool feature. From SSMS results window you can click on the statement to see it.
,QueryText =(select [processing-instruction(q)]=Nodes.value('@SQLTask:SqlStatementSource' ,'varchar(MAX)') for xml path(''),type) ,Nodes.value('local-name(../..)','varchar(max)') Parent ,Nodes.value('../../DTS:Property[@DTS:Name="ObjectName"][1]','varchar(MAX)') ParentName ,Nodes.value('local-name(../../..)','varchar(max)') GrandParent ,Nodes.value('../../../DTS:Property[@DTS:Name="ObjectName"][1]','varchar(MAX)') GrandParentName ,Nodes.value('local-name(../../../..)','varchar(max)') GGParent ,Nodes.value('../../../../DTS:Property[@DTS:Name="ObjectName"][1]','varchar(MAX)') GGParentName from FileData F CROSS APPLY F.pkgXML.nodes('//SQLTask:SqlTaskData[contains(upper-case(@SQLTask:SqlStatementSource)
,upper-case(sql:variable("@F")))]') Pkg(Nodes) union all select Nodes.value('.','varchar(MAX)') Txt ,QueryText =(select [processing-instruction(q)]=Nodes.value('.','varchar(MAX)') for xml path(''),type) ,Nodes.value('local-name(..)','varchar(max)') Parent ,Nodes.value('../DTS:Property[@DTS:Name="ObjectName"][1]','varchar(MAX)') ParentName ,Nodes.value('local-name(../..)','varchar(max)') GrandParent ,Nodes.value('../../DTS:Property[@DTS:Name="ObjectName"][1]','varchar(MAX)') GrandParentName ,Nodes.value('local-name(../../..)','varchar(max)') GGParent ,Nodes.value('../../../DTS:Property[@DTS:Name="ObjectName"][1]','varchar(MAX)') GGParentName from FileData F CROSS APPLY F.pkgXML.nodes('//DTS:Property[@DTS:Name="Expression" and . != "" and contains(upper-case(.)
,upper-case(sql:variable("@F")))]') Pkg(Nodes) union all select Nodes.value('.','varchar(MAX)') Txt ,QueryText =(select [processing-instruction(q)]=Nodes.value('.','varchar(MAX)') for xml path(''),type) ,Nodes.value('local-name(../..)','varchar(max)') Parent ,Nodes.value('../../@name','varchar(MAX)') ParentName ,Nodes.value('local-name(../../../../../..)','varchar(max)') GrandParent ,Nodes.value('../../../../../../DTS:Property[@DTS:Name="ObjectName"][1]','varchar(MAX)') GrandParentName ,Nodes.value('local-name(../../../../../../..)','varchar(max)') GGParent ,Nodes.value('../../../../../../../DTS:Property[@DTS:Name="ObjectName"][1]','varchar(MAX)') GGParentName from FileData F CROSS APPLY F.pkgXML.nodes('//property[(@name="SqlCommand" or @name="SqlCommandVariable" or
@name="OpenRowset" or @name="OpenRowsetVariable") and . != "" and
contains(upper-case(.),upper-case(sql:variable("@F")))]') Pkg(Nodes) ) Select Parent,ParentName,GrandParent,GrandParentName,GGParent,GGParentName,QueryText from Found --where Txt like '%update%' -- use this to further restrict results