Sql-Server

確定文件夾中多個 .DTSX 封包件的 PackageFormatVersion

  • May 21, 2017

Kenneth Fisher 發表了一篇關於如何確定我的 SSIS 包是什麼 SQL 版本的部落格文章?2015 年 4 月。

它有一個表,其中 SQL 版本映射到PackageFormatVersionXML 元數據中的哪個 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

結果看起來像

在此處輸入圖像描述

參考

引用自:https://dba.stackexchange.com/questions/162133