为一个文件夹中的多个.DTSX软件包文件确定PackageFormatVersion


8

肯尼斯·费舍尔(Kenneth Fisher)发表了一篇博客文章,介绍如何确定我的SSIS包是什么SQL版本?在2015年4月。

它具有一个表,该表将哪个SQL版本映射到PackageFormatVersionXML元数据中找到的哪个SSIS包。在查看1个单个包装时,此功能很有用。

我有一个大约100个SSIS .DTSX软件包的文件夹,我需要知道它们都是哪个SQL版本。

如何批量确定文件夹(文件系统)中PackageFormatVersion多个.DTSX软件包的版本(即SQL版本)?

最终目标是确定要获取并实施以将这些软件包放入其中的正确的TFS版本,因为当前不存在任何源代码控制系统。肯尼斯提出的表格将帮助我回答这个问题,但是首先我需要确认软件包的SQL版本是什么。

假设我没有安装BIDS或SSDT。

假设所需的输出是这样的,其中管道指定一个新列:

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

欢迎使用PowerShell,TSQL,可以抓取目录结构的第三方工具或其他工具。


我提供了一个演示应用程序的答案。检查出来
哈迪

命令行/ PowerShell解决方案可以吗?
Stoleg

是的,如果您具有PowerShell解决方案,请出于完整性和后代考虑,也发布一个答案。
John G Hohengarten '17年

1
您的TSQL几乎可以正常工作,我只返回了19个结果。有很多“无法批量加载。文件“ <文件名> .dtsx”不存在”。错误。
John G Hohengarten

1
抱歉,您的回复很晚,是的,您是正确的,它们在子文件夹中。您更新的代码有效!
John G Hohengarten '17

Answers:


5

以编程方式检索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

结果看起来像

在此处输入图片说明

参考文献


@JohnGHohengarten在stackoverflow上查看我的详细答案,我在答案中提供了一个链接以查看它
Hadi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.