Determine la PackageFormatVersion para múltiples archivos de paquetes .DTSX en una carpeta


8

Kenneth Fisher publicó una publicación de blog sobre cómo determinar ¿Qué versión de SQL es mi paquete SSIS? en abril de 2015.

Tiene una tabla de qué versiones de SQL se asignan a cuál PackageFormatVersiondel paquete SSIS encontrado en los metadatos XML. Esto es útil cuando se mira un solo paquete individual.

Tengo una carpeta de aproximadamente 100 .DTSXpaquetes SSIS que necesito saber de qué versión de SQL son todos.

¿Cómo puedo determinar, a granel, cuál PackageFormatVersiones (es decir, la versión SQL) para múltiples .DTSXpaquetes en una carpeta (sistema de archivos)?

El objetivo final es determinar cuál es la versión TFS adecuada para obtener e implementar para colocar estos paquetes, ya que actualmente no existe un sistema de control de origen. La tabla que presenta Kenneth me ayudará a responder esta pregunta, pero primero necesito confirmar cuáles son las versiones SQL del paquete.

Suponga que NO tengo BIDS ni SSDT instalados.

Suponga que un resultado deseado sería algo como esto, donde la tubería designa una nueva columna:

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

PowerShell, TSQL, herramientas de terceros que pueden rastrear una estructura de directorios u otras herramientas son bienvenidas.


proporcioné una respuesta con una aplicación de demostración. échale un vistazo
Hadi

¿Lo haría la línea de comando / solución PowerShell?
Stoleg

Sí, si tiene una solución PowerShell, publique una respuesta con eso también, para completar y posteridad.
John G Hohengarten

1
Su TSQL casi funcionó, solo obtuve 19 resultados devueltos. Hubo una gran cantidad de "No se puede cargar en masa. El archivo" <nombre de archivo> .dtsx "no existe". errores
John G Hohengarten

1
Perdón por la respuesta tardía, sí, estabas en lo correcto, estaban en subcarpetas. ¡Tu código actualizado funciona!
John G Hohengarten

Respuestas:


5

Recupere información de dtsx mediante programación

Puedes leer mi respuesta detallada en StackoverFlow:

Aplicación de demostración

Creé una aplicación de demostración para lograr este procedimiento, puede descargarla desde el siguiente enlace:

También creé un nuevo repositorio Git para esta aplicación de demostración

Captura de pantalla de la aplicación

ingrese la descripción de la imagen aquí

Recupere dtsx PackageFormatVersion usando TSQL

Escribí una consulta SQL para obtener archivos de un directorio específico, filtrar en el archivo * .dtsx y luego leer la PackageFormatVersionpropiedad de ellos.

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

El resultado parece

ingrese la descripción de la imagen aquí

Referencias


@JohnGHohengarten revisa mi respuesta detallada en stackover flow, proporcioné un enlace en mi respuesta, compruébalo
Hadi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.