Obtenir des valeurs dans les packages dtsx
-
Si vous essayez de lire une version de package dans ce package, vous pouvez accéder à l'une des variables système 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.
-
Si vous recherchez la version du package SQL Server, vous pouvez la trouver dans le
dtsx
fichier si vous l'ouvrez en tant que texte (ou xml) et recherchezPackageFormatVersion
propriété, des informations détaillées sont fournies dans les liens suivants :- Études SQL - Quelle version SQL est mon package SSIS ? (ce lien contient le tableau ci-dessous)
- MSDN - Modifications du format de package dans SQL Server Denali
Obtenir des valeurs à partir de fichiers .dtsx stockés sur le serveur SQL
Vous pouvez suivre ces liens :
- Article de Bill Fellows - Requête sur le package SSIS
- Article Microsoft TechNet - Répertorier tous les packages SSIS stockés dans la base de données msdb
il contient des requêtes qui permettent d'obtenir ce problème
Obtenir des valeurs à partir de fichiers .dtsx non stockés sur le serveur SQL
Pour automatiser la lecture de PackageFormatVersion
vous pouvez utiliser le lire par programme en utilisant un XMLParser
ou Regex
. J'ai écrit un code dans Vb.net qui utilise Regex
et bouclez sur .dtsx
fichiers dans un répertoire et obtenir le PackageFormatVersion
propriété et autres propriétés trouvées dans l'en-tête du fichier dtsx :
- PackageFileName
- PackageFormatVersion
- Date de création
- NomCréation
- CreatorComputerName
- CreatorName
- DTSID
- Type exécutable
- LastModifiedProductVersion
- ID de paramètres régionaux
- NomObjet
- Type de package
- VersionBuild
- GUID de version
J'ai d'abord créé une classe nommée PackageInfo
qui contient les propriétés listées ci-dessus
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
Utiliser 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"">)(.*)(?=</DTS:Property>)", 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 ligne de code suivante est celle qui lit le PackageFormatVersion
propriété du fichier
Dim strA As String = Regex.Match(strContent, "(?<=""PackageFormatVersion"">)(.*)(?=</DTS:Property>)", RegexOptions.Singleline).Value
Utilisation de l'analyseur 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
Application de démonstration
J'ai créé une application de démonstration pour réaliser cette procédure, vous pouvez la télécharger à partir du lien suivant :
- Lien de téléchargement Dropbox
J'ai également créé un nouveau référentiel Git pour cette application de démonstration
Capture d'écran de l'application
Obtenir des valeurs à partir de fichiers .dtsx à l'aide de TSQL
Vous pouvez lire ma réponse sur DBA.StackExchange :
- Déterminer le PackageFormatVersion pour plusieurs fichiers de packages .DTSX dans un dossier
Tableau PackageFormatVersion
Et voici le PackageFormatVersion
valeurs du tableau
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