Tentukan PackageFormatVersion untuk beberapa file paket .DTSX dalam folder

8

Kenneth Fisher mengeluarkan posting blog tentang cara menentukan Apa Versi SQL Paket SSIS Saya? pada bulan April 2015.

Ini memiliki tabel yang memetakan versi SQL yang PackageFormatVersionpaket SSIS ditemukan dalam metadata XML. Ini berguna ketika melihat 1 paket tunggal.

Saya memiliki folder sekitar 100 .DTSXpaket SSIS yang perlu saya ketahui Versi SQL mana mereka semua.

Bagaimana saya bisa menentukan, secara massal, apa PackageFormatVersion(yaitu versi SQL) untuk beberapa .DTSXpaket dalam folder (sistem file)?

Tujuan akhirnya adalah menentukan versi TFS mana yang tepat untuk diterapkan dan diterapkan untuk memasukkan paket-paket ini, karena saat ini tidak ada sistem kontrol sumber. Tabel yang disajikan Kenneth akan membantu saya menjawab pertanyaan ini, tetapi pertama-tama saya harus mengkonfirmasi versi paket SQL itu.

Anggap saya TIDAK menginstal BIDS atau SSDT.

Asumsikan output yang diinginkan akan menjadi seperti ini, di mana pipa menunjuk kolom baru:

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

PowerShell, TSQL, alat pihak ke-3 yang dapat merayapi struktur direktori, atau alat lain dipersilakan.

John G Hohengarten
sumber
saya memberikan jawaban dengan aplikasi Demo. check it out
Hadi
Apakah solusi command line / PowerShell dapat berfungsi?
Stoleg
Ya, jika Anda memiliki solusi PowerShell, silakan posting jawaban dengan itu juga, untuk kelengkapan dan keturunan.
John G Hohengarten
1
TSQL Anda hampir berfungsi, saya hanya mendapatkan 19 hasil yang dikembalikan. Ada banyak "Tidak dapat memuat massal. File" <filename> .dtsx "tidak ada." kesalahan.
John G Hohengarten
1
Maaf atas keterlambatan balasan, ya, Anda benar, mereka ada di sub-folder. Kode Anda yang diperbarui berfungsi!
John G Hohengarten

Jawaban:

5

Ambil info dtsx secara terprogram

Anda dapat membaca jawaban terperinci saya di StackoverFlow:

Aplikasi Demo

Saya Membuat Aplikasi Demo untuk mencapai prosedur ini, Anda dapat mengunduhnya dari tautan berikut:

Saya juga membuat repositori Git baru untuk aplikasi demo ini

Tangkapan layar aplikasi

masukkan deskripsi gambar di sini

Ambil PackageFormatVersion dtsx menggunakan TSQL

Saya menulis query SQL yang mendapatkan file dari direktori tertentu, memfilter file * .dtsx kemudian membaca PackageFormatVersionproperti dari mereka.

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

Hasilnya terlihat seperti

masukkan deskripsi gambar di sini

Referensi

Hadi
sumber
@JohnGHohengarten memeriksa jawaban terperinci saya pada aliran stackover, saya memberikan tautan pada jawaban saya, memeriksanya
Hadi