Déterminer la PackageFormatVersion pour plusieurs fichiers de packages .DTSX dans un dossier

8

Kenneth Fisher a publié un article de blog sur la façon de déterminer quelle version SQL est mon package SSIS? en avril 2015.

Il contient un tableau des versions de SQL PackageFormatVersionmappées à celles du package SSIS trouvé dans les métadonnées XML. Ceci est utile lorsque vous regardez un seul paquet individuel.

J'ai un dossier d'environ 100 .DTSXpackages SSIS dont j'ai besoin de savoir de quelle version SQL ils sont tous.

Comment puis-je déterminer, en vrac, ce que PackageFormatVersion(c'est-à-dire la version SQL) pour plusieurs .DTSXpackages dans un dossier (système de fichiers)?

Le but final est de déterminer quelle est la bonne version TFS à obtenir et à implémenter pour mettre ces packages, car aucun système de contrôle de source n'existe actuellement. Le tableau présenté par Kenneth m'aidera à répondre à cette question, mais je dois d'abord confirmer quelles sont les versions SQL du package.

Supposons que je n'ai pas installé BIDS ni SSDT.

Supposons qu'une sortie souhaitée soit quelque chose comme ceci, où pipe désigne une nouvelle colonne:

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

PowerShell, TSQL, les outils tiers pouvant analyser une structure de répertoires ou d'autres outils sont les bienvenus.

John G Hohengarten
la source
j'ai fourni une réponse avec une application de démonstration. check it out
Hadi
La solution de ligne de commande / PowerShell ferait-elle l'affaire?
Stoleg
Oui, si vous avez une solution PowerShell, veuillez également poster une réponse avec celle-ci, par souci d'exhaustivité et de postérité.
John G Hohengarten
1
Votre TSQL a presque fonctionné, je n'ai obtenu que 19 résultats. Il y avait beaucoup de "Impossible de charger en bloc. Le fichier" <nomfichier> .dtsx "n'existe pas." les erreurs.
John G Hohengarten
1
Désolé pour la réponse tardive, oui, vous aviez raison, ils étaient dans des sous-dossiers. Votre code mis à jour fonctionne!
John G Hohengarten

Réponses:

5

Récupérer les informations dtsx par programme

Vous pouvez lire ma réponse détaillée sur StackoverFlow:

Application de démonstration

J'ai créé une application de démonstration pour réaliser cette procédure, vous pouvez la télécharger à partir du lien suivant:

J'ai également créé un nouveau référentiel Git pour cette application de démonstration

Capture d'écran de l'application

entrez la description de l'image ici

Récupérer dtsx PackageFormatVersion à l'aide de TSQL

J'ai écrit une requête SQL qui récupère les fichiers à partir d'un répertoire spécifique, filtre sur le fichier * .dtsx puis leur lit la PackageFormatVersionpropriété.

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

Le résultat ressemble

entrez la description de l'image ici

Références

Hadi
la source
@JohnGHohengarten vérifier ma réponse détaillée au flux de stackover, j'ai fourni un lien dans ma réponse check it out
Hadi