Determinare PackageFormatVersion per più file di pacchetti .DTSX in una cartella


8

Kenneth Fisher ha pubblicato un post sul blog su come determinare quale versione SQL è il mio pacchetto SSIS? ad aprile 2015.

Ha una tabella di cui vengono mappate le versioni SQL su quale PackageFormatVersionpacchetto SSIS trovato nei metadati XML. Questo è utile quando si guarda 1 singolo pacchetto individuale.

Ho una cartella di circa 100 .DTSXpacchetti SSIS che devo sapere quale versione SQL sono tutti.

Come posso determinare, in blocco, quale PackageFormatVersion(ovvero la versione SQL) per più .DTSXpacchetti in una cartella (file system)?

L'obiettivo finale è determinare quale sia la versione TFS corretta da ottenere e implementare per inserire questi pacchetti, poiché attualmente non esiste alcun sistema di controllo del codice sorgente. La tabella presentata da Kenneth mi aiuterà a rispondere a questa domanda, ma prima devo confermare quali sono le versioni del pacchetto SQL.

Supponiamo che NON ho BIDS né SSDT installati.

Supponiamo che l'output desiderato sia qualcosa del genere, in cui pipe indica una nuova colonna:

PackageFilename | PackageFormatVersion
--------------------------------------
Package1.dtsx   | 3
Package2.dtsx   | 4

PowerShell, TSQL, strumenti di terze parti che possono eseguire la scansione di una struttura di directory o altri strumenti sono i benvenuti.


ho fornito una risposta con un'app demo. dai un'occhiata
Hadi,

La riga di comando / soluzione PowerShell farebbe?
Stoleg,

Sì, se si dispone di una soluzione PowerShell, inviare anche una risposta con quella, per completezza e posterità.
John G Hohengarten,

1
Il tuo TSQL ha funzionato quasi, ho ottenuto solo 19 risultati. Ci sono stati molti "Impossibile caricare in blocco. Il file" <nomefile> .dtsx "non esiste." errori.
John G Hohengarten,

1
Ci scusiamo per la risposta tardiva, sì, avevi ragione, erano in sottocartelle. Il tuo codice aggiornato funziona!
John G Hohengarten,

Risposte:


5

Recupera informazioni dtsx a livello di codice

Puoi leggere la mia risposta dettagliata su StackoverFlow:

App demo

Ho creato un'applicazione demo per ottenere questa procedura, puoi scaricarla dal seguente link:

Inoltre ho creato un nuovo repository Git per questa app demo

Schermata dell'app

inserisci qui la descrizione dell'immagine

Recupera dtsx PackageFormatVersion utilizzando TSQL

Ho scritto una query SQL che ottiene i file da una directory specifica, filtra sul file * .dtsx e legge le PackageFormatVersionproprietà da essi.

--Result Table
CREATE TABLE #TblResult (filepath varchar(MAX) , packageformatversion INT)

--Get Files From Directory

declare @files table (FileName nvarchar(4000))

--Get files fullpath
declare @myPath nvarchar(4000) =  'C:\Users\Admin\Desktop\Stack Overflow';

IF OBJECT_ID('tempdb..#DirectoryTree') IS NOT NULL
DROP TABLE #DirectoryTree;

CREATE TABLE #DirectoryTree (
   id int IDENTITY(1,1)
   ,subdirectory nvarchar(512)
   ,depth int
   ,isfile bit
   , ParentDirectory int
   ,flag tinyint default(0));

-- top level directory
INSERT #DirectoryTree (subdirectory,depth,isfile)
   VALUES (@myPath,0,0);
-- all the rest under top level
INSERT #DirectoryTree (subdirectory,depth,isfile)
   EXEC master.sys.xp_dirtree @myPath,0,1;


UPDATE #DirectoryTree
   SET ParentDirectory = (
      SELECT MAX(Id) FROM #DirectoryTree
      WHERE Depth = d.Depth - 1 AND Id < d.Id   )
FROM #DirectoryTree d;

-- SEE all with full paths
WITH dirs AS (
    SELECT
       Id,subdirectory,depth,isfile,ParentDirectory,flag
       , CAST (null AS NVARCHAR(MAX)) AS container
       , CAST([subdirectory] AS NVARCHAR(MAX)) AS dpath
       FROM #DirectoryTree
       WHERE ParentDirectory IS NULL 
    UNION ALL
    SELECT
       d.Id,d.subdirectory,d.depth,d.isfile,d.ParentDirectory,d.flag
       , dpath as container
       , dpath +'\'+d.[subdirectory]  
    FROM #DirectoryTree AS d
    INNER JOIN dirs ON  d.ParentDirectory = dirs.id
)
insert into @files (filename)
SELECT dpath FROM dirs 
WHERE subdirectory like '%.dtsx'


DECLARE @file NVARCHAR(4000)

--Loop over dtsx files

DECLARE csr CURSOR FOR SELECT [FileName] FROM @files

OPEN csr

FETCH NEXT FROM csr INTO @file

WHILE @@fetch_status <> - 1
BEGIN

--Read xml from dtsx file

CREATE TABLE #TblTemp (data varchar(MAX));

DECLARE @strQuery NVARCHAR(4000)

SET @strQuery = 'BULK INSERT #TblTemp
   FROM ''' + @file + '''
   WITH 
      (
         ROWTERMINATOR = ''''
      )'

EXEC(@strQuery)

--Get PackageFormatVersion 

INSERT INTO #TblResult (filepath, packageformatversion)
SELECT @file, SUBSTRING(data  
                 ,CHARINDEX('DTS:Name="PackageFormatVersion">',data,1) + LEN('DTS:Name="PackageFormatVersion">') 
                 ,CHARINDEX('<',SUBSTRING(data,CHARINDEX('DTS:Name="PackageFormatVersion">',data,1) + LEN('DTS:Name="PackageFormatVersion">'), 3) ,1) - 1)

FROM #TblTemp


DROP TABLE #TblTemp

FETCH NEXT FROM csr INTO @file

END

CLOSE csr
DEALLOCATE csr

--Read Result

SELECT DISTINCT * FROM #TblResult

--Drop temp Table

DROP TABLE #TblResult

Il risultato è simile

inserisci qui la descrizione dell'immagine

Riferimenti


@JohnGHohengarten controlla la mia risposta dettagliata al flusso di stackover, ho fornito un link nella mia risposta verifica
Hadi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.