Sql-Server
確定文件夾中多個 .DTSX 封包件的 PackageFormatVersion
Kenneth Fisher 發表了一篇關於如何確定我的 SSIS 包是什麼 SQL 版本的部落格文章?2015 年 4 月。
它有一個表,其中 SQL 版本映射到
PackageFormatVersion
XML 元數據中的哪個 SSIS 包。這在查看 1 個單獨的包時很有用。我有一個包含大約 100 個 SSIS
.DTSX
包的文件夾,我需要知道它們都是哪個 SQL 版本。如何批量確定文件夾(文件系統)
PackageFormatVersion
中多個包的(即 SQL 版本)是什麼?.DTSX
最終目標是確定哪個是正確的 TFS 版本來獲取和實施以將這些包放入其中,因為目前不存在原始碼控制系統。Kenneth 提供的表格將幫助我回答這個問題,但首先我需要確認包 SQL 版本是什麼。
假設我沒有安裝 BIDS 或 SSDT。
假設所需的輸出是這樣的,其中管道指定一個新列:
PackageFilename | PackageFormatVersion -------------------------------------- Package1.dtsx | 3 Package2.dtsx | 4
歡迎使用 PowerShell、TSQL、可以爬取目錄結構的 3rd 方工具或其他工具。
以程式方式檢索 dtsx 資訊
你可以閱讀我在 StackoverFlow 上的詳細回答:
展示應用
我創建了一個展示應用程序來實現此過程,您可以從以下連結下載它:
我還為這個展示應用程序創建了一個新的Git 儲存庫
應用截圖
使用 TSQL 檢索 dtsx PackageFormatVersion
我編寫了一個 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
結果看起來像
參考