Определите PackageFormatVersion для нескольких файлов пакетов .DTSX в папке

8

Кеннет Фишер опубликовал сообщение в блоге о том, как определить, какая версия SQL является моим пакетом служб SSIS? в апреле 2015 года.

У него есть таблица, из которой сопоставляются версии SQL и какой PackageFormatVersionпакет служб SSIS находится в метаданных XML. Это полезно при просмотре одного отдельного пакета.

У меня есть папка с примерно 100 .DTSXпакетами служб SSIS, которые мне нужны, чтобы знать, к какой версии SQL они относятся.

Как я могу определить, в общем, что PackageFormatVersion(то есть версия SQL) для нескольких .DTSXпакетов в папке (файловая система)?

Конечная цель состоит в том, чтобы определить, какую версию TFS следует получить и внедрить для установки этих пакетов, поскольку в настоящее время не существует системы контроля версий. Таблица, которую представляет Кеннет, поможет мне ответить на этот вопрос, но сначала я должен подтвердить, какие версии пакета SQL.

Предположим, что у меня НЕ установлены ни BIDS, ни SSDT.

Предположим, что желаемый результат будет примерно таким, где труба обозначает новый столбец:

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

PowerShell, TSQL, сторонние инструменты, которые могут сканировать структуру каталогов, или другие инструменты приветствуются.

Джон Г Хоэнгартен
источник
я предоставил ответ с демо-приложением. проверить это
Хади
Будет ли решение командной строки / PowerShell?
Стелег
Да, если у вас есть решение PowerShell, пожалуйста, отправьте ответ с ним, для полноты и потомков.
Джон Г Хоэнгартен,
1
Ваш TSQL почти сработал, я получил только 19 результатов. Было много «Не удается выполнить массовую загрузку. Файл« <имя файла> .dtsx »не существует». ошибки.
Джон Г Хоэнгартен,
1
Извините за поздний ответ, да, вы были правы, они были в подпапках. Ваш обновленный код работает!
Джон Г Хоэнгартен

Ответы:

5

Получить информацию о DTSX программно

Вы можете прочитать мой подробный ответ на StackoverFlow:

Демо-приложение

Я создал демонстрационное приложение, чтобы выполнить эту процедуру, вы можете скачать его по следующей ссылке:

Также я создал новый Git-репозиторий для этого демонстрационного приложения.

Скриншот приложения

введите описание изображения здесь

Получите dtsx PackageFormatVersion, используя TSQL

Я написал SQL-запрос, который получает файлы из определенного каталога, фильтрует файл * .dtsx и затем считывает их PackageFormatVersionсвойства.

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

Результат выглядит как

введите описание изображения здесь

Ссылки

Хади
источник
@JohnGHohengarten проверь мой подробный ответ на стековом потоке, я предоставил ссылку в своем ответе проверь его
Хади