Bestimmen Sie die PackageFormatVersion für mehrere .DTSX-Paketdateien in einem Ordner

8

Kenneth Fisher veröffentlichte einen Blog-Beitrag darüber, wie festgestellt werden kann, welche SQL-Version mein SSIS-Paket ist. im April 2015.

Es enthält eine Tabelle, welche SQL-Versionen welchem PackageFormatVersionder in den XML-Metadaten gefundenen SSIS-Pakete zugeordnet sind. Dies ist nützlich, wenn Sie sich ein einzelnes Paket ansehen.

Ich habe einen Ordner mit ungefähr 100 SSIS- .DTSXPaketen, in denen ich wissen muss, um welche SQL-Version es sich handelt.

Wie kann ich in großen Mengen bestimmen, was die PackageFormatVersion(dh die SQL-Version) für mehrere .DTSXPakete in einem Ordner (Dateisystem) ist?

Das Endziel besteht darin, zu bestimmen, welche TFS-Version zum Abrufen und Implementieren dieser Pakete geeignet ist, da derzeit kein Versionsverwaltungssystem vorhanden ist. Die Tabelle, die Kenneth vorlegt, hilft mir bei der Beantwortung dieser Frage, aber zuerst muss ich bestätigen, um welche SQL-Paketversionen es sich handelt.

Angenommen, ich habe weder BIDS noch SSDT installiert.

Angenommen, eine gewünschte Ausgabe wäre ungefähr so, wobei Pipe eine neue Spalte bezeichnet:

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

PowerShell, TSQL, Tools von Drittanbietern, die eine Verzeichnisstruktur crawlen können, oder andere Tools sind willkommen.

John G Hohengarten
quelle
Ich gab eine Antwort mit einer Demo-App. check it out
Hadi
Würde eine Befehlszeilen- / PowerShell-Lösung funktionieren?
Stoleg
Ja, wenn Sie eine PowerShell-Lösung haben, geben Sie der Vollständigkeit und Nachwelt halber auch eine Antwort dazu.
John G Hohengarten
1
Ihre TSQL hat fast funktioniert, ich habe nur 19 Ergebnisse zurückgegeben. Es gab viele "Massenladevorgänge nicht möglich. Die Datei" <Dateiname> .dtsx "ist nicht vorhanden." Fehler.
John G Hohengarten
1
Entschuldigung für die späte Antwort, ja, Sie hatten Recht, sie befanden sich in Unterordnern. Ihr aktualisierter Code funktioniert!
John G Hohengarten

Antworten:

5

Rufen Sie dtsx-Informationen programmgesteuert ab

Sie können meine ausführliche Antwort auf StackoverFlow lesen:

Demo App

Ich habe eine Demo-Anwendung erstellt, um dieses Verfahren zu erreichen. Sie können sie über den folgenden Link herunterladen:

Außerdem habe ich ein neues Git-Repository für diese Demo-App erstellt

App Screenshot

Geben Sie hier die Bildbeschreibung ein

Rufen Sie dtsx PackageFormatVersion mit TSQL ab

Ich habe eine SQL-Abfrage geschrieben, die Dateien aus einem bestimmten Verzeichnis abruft, nach * .dtsx-Dateien filtert und dann PackageFormatVersionEigenschaften daraus liest .

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

Ergebnis sieht aus wie

Geben Sie hier die Bildbeschreibung ein

Verweise

Hadi
quelle
@ JohnGHohengarten überprüfen Sie meine detaillierte Antwort bei Stackover Flow, ich gab einen Link in meiner Antwort überprüfen Sie es aus
Hadi