Automazione del numero di versione Recupero da file .Dtsx

C’è un modo o una query con cui posso trovare il numero di versione dei pacchetti SSIS (file * .dtsx)?

Ho i file *.dtsx nel mio Team Foundation Server per il quale volevo sapere.

Il modo manuale è di fare un clic con il tasto destro del mouse sul pacchetto e fare clic su Compare per vedere il VersionBuild ma ci sono migliaia di pacchetti, quindi farlo manualmente non è ansible

Nota: il processo deve essere automatizzato, non manuale

    Ottenere valori nei pacchetti dtsx

    • Se si sta tentando di leggere una versione del pacchetto all’interno di questo pacchetto, è ansible accedere a una delle variabili di sistema SSIS

       Variable Type Description ------------------------------------------- VersionBuild Int32 The package version. VersionComment String Comments about the package version. VersionGUID String The unique identifier of the version. VersionMajor Int32 The major version of the package. VersionMinor Int32 The minor version of the package. 
    • Se stai cercando Package SQL Server Version, puoi trovarlo all’interno del file dtsx se lo apri come text (o xml) e cerca la proprietà PackageFormatVersion , le informazioni dettagliate sono fornite nei seguenti link:

      • Studi SQL – Quale versione SQL è il mio pacchetto SSIS? (questo link contiene la tabella di seguito riportata)
      • MSDN – Modifiche al formato del pacchetto in SQL Server Denali

    Ottenere valori da file .dtsx memorizzati nel server SQL

    Puoi seguire questi link:

    • bill fellows article – Richiesta del pacchetto SSIS
    • Articolo di Microsoft TechNet: elenca tutti i pacchetti SSIS archiviati nel database msdb

    contiene query che raggiungono questo problema

    Ottenere valori da file .dtsx non memorizzati nel server Sql

    Per automatizzare la lettura di PackageFormatVersion è ansible leggerlo a livello di PackageFormatVersion utilizzando un XMLParser o Regex . Ho scritto un codice in Vb.net che utilizza Regex e loop su file .dtsx all’interno di una directory e ottenere la proprietà PackageFormatVersion e altre proprietà trovate nell’intestazione del file dtsx:

    • PackageFileName
    • PackageFormatVersion
    • Data di creazione
    • CreationName
    • CreatorComputerName
    • CreatorName
    • DTSID
    • ExecutableType
    • LastModifiedProductVersion
    • LocaleID
    • ObjectName
    • Tipo di pacchetto
    • VersionBuild
    • VersionGUID

    Per prima cosa ho creato una class denominata PackageInfo che contiene le proprietà elencate sopra

     Public Class PackageInfo Public Property PackageFileName As String Public Property PackageFormatVersion As String Public Property CreationDate As String Public Property CreationName As String Public Property CreatorComputerName As String Public Property CreatorName As String Public Property DTSID As String Public Property ExecutableType As String Public Property LastModifiedProductVersion As String Public Property LocaleID As String Public Property ObjectName As String Public Property PackageType As String Public Property VersionBuild As String Public Property VersionGUID As String End Class 

    Utilizzo di RegEx

     Private Sub ReadPackagesInfo(ByVal strDirectory As String) m_lst.Clear() For Each strFile As String In IO.Directory.GetFiles(strDirectory, "*.dtsx", IO.SearchOption.AllDirectories) Dim strContent As String = "" Using sr As New IO.StreamReader(strFile) strContent = sr.ReadToEnd sr.Close() End Using Dim strPackageFormatVersion As String = Regex.Match(strContent, "(?<=""PackageFormatVersion"">)(.*)(?=)", RegexOptions.Singleline).Value Dim strCreationDate As String = Regex.Match(strContent, "(?<=DTS:CreationDate="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strCreationName As String = Regex.Match(strContent, "(?<=DTS:CreationName="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strCreatorComputerName As String = Regex.Match(strContent, "(?<=DTS:CreatorComputerName="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strCreatorName As String = Regex.Match(strContent, "(?<=DTS:CreatorName="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strDTSID As String = Regex.Match(strContent, "(?<=DTS:DTSID="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strExecutableType As String = Regex.Match(strContent, "(?<=DTS:ExecutableType="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strLastModifiedProductVersion As String = Regex.Match(strContent, "(?<=DTS:LastModifiedProductVersion="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strLocaleID As String = Regex.Match(strContent, "(?<=DTS:LocaleID="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strObjectName As String = Regex.Match(strContent, "(?<=DTS:ObjectName="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strPackageType As String = Regex.Match(strContent, "(?<=DTS:PackageType="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strVersionBuild As String = Regex.Match(strContent, "(?<=DTS:VersionBuild="")(.*?)(?="")", RegexOptions.Singleline).Value Dim strVersionGUID As String = Regex.Match(strContent, "(?<=DTS:VersionGUID="")(.*?)(?="")", RegexOptions.Singleline).Value m_lst.Add(New PackageInfo With {.PackageFileName = strFile, .PackageFormatVersion = strPackageFormatVersion, .CreationDate = strCreationDate, .CreationName = strCreationName, .CreatorComputerName = strCreatorComputerName, .CreatorName = strCreatorName, .DTSID = strDTSID, .ExecutableType = strExecutableType, .LastModifiedProductVersion = strLastModifiedProductVersion, .LocaleID = strLocaleID, .ObjectName = strObjectName, .PackageType = strPackageType, .VersionBuild = strVersionBuild, .VersionGUID = strVersionGUID}) Next End Sub 

    La seguente riga di codice è quella che legge la proprietà PackageFormatVersion dal file

     Dim strA As String = Regex.Match(strContent, "(?<=""PackageFormatVersion"">)(.*)(?=)", RegexOptions.Singleline).Value 

    Utilizzo del parser Xml

      Private Sub ReadPackagesInfoUsingXmlParser(ByVal strDirectory As String) m_lst.Clear() For Each strFile As String In IO.Directory.GetFiles(strDirectory, "*.dtsx", IO.SearchOption.AllDirectories) Dim strPackageFormatVersion As String = "" Dim strCreationDate As String = "" Dim strCreationName As String = "" Dim strCreatorComputerName As String = "" Dim strCreatorName As String = "" Dim strDTSID As String = "" Dim strExecutableType As String = "" Dim strLastModifiedProductVersion As String = "" Dim strLocaleID As String = "" Dim strObjectName As String = "" Dim strPackageType As String = "" Dim strVersionBuild As String = "" Dim strVersionGUID As String = "" Dim xml = XDocument.Load(strFile) Dim ns As XNamespace = "www.microsoft.com/SqlServer/Dts" Dim man As XmlNamespaceManager = New XmlNamespaceManager(New NameTable()) man.AddNamespace("DTS", "www.microsoft.com/SqlServer/Dts") If Not xml.Root Is Nothing AndAlso Not xml.Root.Descendants(ns + "Property").Attributes(ns + "Name") Is Nothing AndAlso xml.Root.Descendants(ns + "Property").Attributes(ns + "Name").Where(Function(x) x.Value = "PackageFormatVersion").Count > 0 Then strPackageFormatVersion = xml.Root.Descendants(ns + "Property").Attributes(ns + "Name").Where(Function(x) x.Value = "PackageFormatVersion").FirstOrDefault.Parent.Value strCreationDate = If(xml.Root.Attributes(ns + "CreationDate").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "CreationDate").FirstOrDefault.Value) strCreationName = If(xml.Root.Attributes(ns + "CreationName").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "CreationName").FirstOrDefault.Value) strCreatorComputerName = If(xml.Root.Attributes(ns + "CreatorComputerName").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "CreatorComputerName").FirstOrDefault.Value) strCreatorName = If(xml.Root.Attributes(ns + "CreatorName").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "CreatorName").FirstOrDefault.Value) strDTSID = If(xml.Root.Attributes(ns + "DTSID").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "DTSID").FirstOrDefault.Value) strExecutableType = If(xml.Root.Attributes(ns + "ExecutableType").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "ExecutableType").FirstOrDefault.Value) strLastModifiedProductVersion = If(xml.Root.Attributes(ns + "LastModifiedProductVersion").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "LastModifiedProductVersion").FirstOrDefault.Value) strLocaleID = If(xml.Root.Attributes(ns + "LocaleID").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "LocaleID").FirstOrDefault.Value) strObjectName = If(xml.Root.Attributes(ns + "ObjectName").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "ObjectName").FirstOrDefault.Value) strPackageType = If(xml.Root.Attributes(ns + "PackageType").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "PackageType").FirstOrDefault.Value) strVersionBuild = If(xml.Root.Attributes(ns + "VersionBuild").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "VersionBuild").FirstOrDefault.Value) strVersionGUID = If(xml.Root.Attributes(ns + "VersionGUID").FirstOrDefault Is Nothing, "", xml.Root.Attributes(ns + "VersionGUID").FirstOrDefault.Value) End If m_lst.Add(New PackageInfo With {.PackageFileName = strFile, .PackageFormatVersion = strPackageFormatVersion, .CreationDate = strCreationDate, .CreationName = strCreationName, .CreatorComputerName = strCreatorComputerName, .CreatorName = strCreatorName, .DTSID = strDTSID, .ExecutableType = strExecutableType, .LastModifiedProductVersion = strLastModifiedProductVersion, .LocaleID = strLocaleID, .ObjectName = strObjectName, .PackageType = strPackageType, .VersionBuild = strVersionBuild, .VersionGUID = strVersionGUID}) Next End Sub 

    App Demo

    Ho creato un'applicazione demo per ottenere questa procedura è ansible scaricarla dal seguente link:

    • Link per il download di Dropbox

    Inoltre ho creato un nuovo repository Git per questa app demo

    Screenshot dell'app

    inserisci la descrizione dell'immagine qui

    Ottenere valori da file .dtsx usando TSQL

    Puoi leggere la mia risposta su DBA.StackExchange:

    • Determina PackageFormatVersion per più file .DTSX in una cartella

    PackageFormatVersion Table

    Ed ecco i valori della tabella PackageFormatVersion

     SQL Version Build # PackageFormatVersion Visual Studio Version 2005 9 2 2005 2008 10 3 2008 2008 R2 10.5 3 2008 2012 11 6 2010 or BI 2012 2014 12 8 2012 CTP2 or 2013 2016 13 8 2015 

    È ansible utilizzare questa query se si utilizza la soluzione di distribuzione del progetto (se si dispone di SSISDB nel server):

     SELECT [name], [package_format_version] FROM [SSISDB].[catalog].[packages]; 

    Nota: i servizi di integrazione devono essere installati

    .ispac file .ispac è in realtà un file zip e ogni .dtsx è un file XML con tutte le informazioni necessarie al suo interno. Inoltre, per rispondere agli amici inviati, lo stesso XML contiene tutte le informazioni che desideri. inserisci la descrizione dell'immagine qui

    Spero che questo ti aiuta 🙂