Xác định GóiFormatVersion cho nhiều tệp gói .DTSX trong một thư mục


8

Kenneth Fisher đặt một bài đăng trên blog về cách xác định Phiên bản SQL nào là Gói SSIS của tôi? vào tháng 4/2015.

Nó có một bảng trong đó các phiên bản SQL ánh xạ tới PackageFormatVersiongói SSIS nào được tìm thấy trong siêu dữ liệu XML. Điều này rất hữu ích khi nhìn vào 1 gói riêng lẻ.

Tôi có một thư mục gồm khoảng 100 .DTSXgói SSIS mà tôi cần biết tất cả phiên bản SQL nào.

Làm thế nào tôi có thể xác định hàng loạt, cái gì PackageFormatVersion(tức là phiên bản SQL) cho nhiều .DTSXgói trong một thư mục (hệ thống tệp)?

Mục tiêu cuối cùng là xác định phiên bản TFS thích hợp nào sẽ nhận và triển khai để đưa các gói này vào, vì hiện tại không có hệ thống kiểm soát nguồn nào tồn tại. Bảng trình bày của Kenneth sẽ giúp tôi trả lời câu hỏi này, nhưng trước tiên tôi cần xác nhận các phiên bản SQL gói là gì.

Giả sử rằng tôi KHÔNG cài đặt BIDS hay SSDT.

Giả sử một đầu ra mong muốn sẽ giống như thế này, trong đó ống chỉ định một cột mới:

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

PowerShell, TSQL, các công cụ của bên thứ 3 có thể thu thập dữ liệu cấu trúc thư mục hoặc các công cụ khác đều được chào đón.


tôi đã cung cấp một câu trả lời với một ứng dụng Demo. kiểm tra xem
Hadi

Lệnh dòng / giải pháp PowerShell sẽ làm gì?
Stoleg

Có, nếu bạn có giải pháp PowerShell, vui lòng gửi câu trả lời với điều đó, để hoàn thiện và hậu thế.
John G Hohengarten

1
TSQL của bạn gần như đã hoạt động, tôi chỉ nhận được 19 kết quả. Có rất nhiều "Không thể tải số lượng lớn. Tệp" <tên tệp> .dtsx "không tồn tại." lỗi.
John G Hohengarten

1
Xin lỗi vì trả lời trễ, vâng, bạn đã đúng, chúng nằm trong các thư mục con. Mã cập nhật của bạn hoạt động!
John G Hohengarten

Câu trả lời:


5

Lấy thông tin dtsx theo chương trình

Bạn có thể đọc câu trả lời chi tiết của tôi trên StackoverFlow:

Ứng dụng demo

Tôi đã tạo Ứng dụng Demo để đạt được quy trình này, bạn có thể tải xuống từ liên kết sau:

Ngoài ra tôi đã tạo một kho Git mới cho ứng dụng demo này

Ảnh chụp màn hình ứng dụng

nhập mô tả hình ảnh ở đây

Truy xuất gói dtsxFormatVersion bằng TSQL

Tôi đã viết một truy vấn SQL để lấy các tệp từ một thư mục cụ thể, lọc trên tệp * .dtsx sau đó đọc thuộc PackageFormatVersiontính từ chúng.

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

Kết quả trông như

nhập mô tả hình ảnh ở đây

Người giới thiệu


@JohnGHohengarten kiểm tra câu trả lời chi tiết của tôi tại dòng stackover, tôi cung cấp một liên kết trong câu trả lời của tôi check it out
Hadi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.