2013-05-03 7 views
6

Sto cercando qualcosa per estrarre tutte le query SQL presenti nel mio pacchetto SSIS/DTSX. Ma nulla mi sta aiutando fino ad ora.Estrazione di istruzioni SQL da un pacchetto SSIS/DTSX

Ho già dato un'occhiata alle API Microsoft.SqlServer.DTS di Microsoft. Ma stanno estraendo alcune domande direttamente. Ma le query che sono presenti in DTS: variabile TAG, non vengono estratte.

Voglio qualcosa in .Net framework. Poiché ho bisogno di utilizzare l'output per eseguire anche altri compiti. Sto usando C#.

Codice di esempio come segue. Non affronta tutte le situazioni

// 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

Ci sono alcuni luoghi si potrebbe avere una query in un pacchetto SSIS. Hai veramente bisogno di tutti questi posti o c'è un sottoinsieme da cui hai richiesto le query? Sono anche un po 'perso sul problema con le query in una variabile, stai dicendo che sei riuscito a capire come utilizzare l'API per enumerare il modello di oggetti ma non riesci a capire come estrarre il valore di una variabile? Infine, se una query è parametrizzata o costruita con un'espressione, come ti aspetti che venga segnalata? Pubblica il codice esistente che hai dato che può fornirci un punto di partenza invece di fare tutto – billinkc

+0

Sì, voglio estrarre tutte le query ovunque possano essere possibili nel pacchetto SSIS. Sì, ho capito come utilizzare l'API ma non riuscivo a capire dove sono memorizzati i valori delle variabili del modello oggetto. Si prega di leggere la mia risposta per lo snippet di codice. –

+0

Qualcuno può aiutarmi su questo? –

risposta

0

C'è un altro modo.

È possibile creare un evento di registro personalizzato. È scritto su qui:

enabling custom logging for ssis tasks

Poi basta eseguire il pacchetto e analizzare il file di registro creato.

Non sono sicuro di DTS, ma questo dovrebbe ottenere tutto l'SQL dalle espressioni ecc. In un pacchetto SSIS.

3

la seguente query è utile per recuperare tutte le istruzioni SQL all'interno del pacchetto SSIS

;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)') <>'' 
+0

Cosa stai cercando di trasmettere? –

+0

La query precedente è utile per recuperare tutte le istruzioni sql all'interno del pacchetto SSIS come richiesto. –

+0

Utilizzare 4 spazi davanti al codice per formattarlo come codice. –