Kenneth Fisherは、2015年4月に、どのように決定するかについてのブログ投稿 SQLのバージョンは私のSSISパッケージですか? を公開しました。
これには、XMLメタデータで見つかったSSISパッケージのどのPackageFormatVersion
にどのSQLバージョンがマップされるかというテーブルがあります。これは、1つの個別のパッケージを確認するときに役立ちます。
約100のSSIS .DTSX
パッケージのフォルダーがあり、すべてのSQLバージョンを知る必要があります。
フォルダー(ファイルシステム)内の複数の.DTSX
パッケージのPackageFormatVersion
(SQLバージョン)をまとめて判断するにはどうすればよいですか?
最終的な目標は、現在ソース管理システムが存在しないため、これらのパッケージを取得して実装するための適切なTFSバージョンを決定することです。 Kennethが提示する表は、この質問に答えるのに役立ちますが、まず、SQLバージョンのパッケージを確認する必要があります。
BIDSもSSDTもインストールされていないとします。
必要な出力が次のようなものであると仮定します。ここで、pipeは新しい列を指定します。
PackageFilename | PackageFormatVersion
--------------------------------------
Package1.dtsx | 3
Package2.dtsx | 4
PowerShell、TSQL、ディレクトリ構造をクロールできるサードパーティツール、またはその他のツールを歓迎します。
StackoverFlowで私の詳細な回答を読むことができます:
デモアプリ
この手順を実行するためにデモアプリケーションを作成しました。次のリンクからダウンロードできます。
また、このデモアプリ用に新しい Git-repository を作成しました
アプリのスクリーンショット
特定のディレクトリからファイルを取得する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
結果は次のようになります
参照