Ottenere valori all'interno dei pacchetti dtsx
-
Se stai cercando di leggere una versione di un pacchetto all'interno di questo pacchetto, puoi 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 la versione del pacchetto SQL Server, puoi trovarla all'interno di
dtsx
file se lo apri come testo (o xml) e cercaPackageFormatVersion
proprietà, informazioni dettagliate sono fornite ai seguenti link:- Studi SQL:quale versione SQL è il mio pacchetto SSIS? (questo link contiene la tabella scritta sotto)
- MSDN - Modifiche al formato del pacchetto in SQL Server Denali
Ottenere valori dai file .dtsx archiviati nel server SQL
Puoi seguire questi link:
- Articolo Bill Fellow - Query sul pacchetto SSIS
- Articolo Microsoft TechNet - Elenca tutti i pacchetti SSIS archiviati nel database msdb
contiene query che soddisfano questo problema
Ottenere valori da file .dtsx non archiviati nel server SQL
Per automatizzare la lettura di PackageFormatVersion
puoi usarlo per leggerlo a livello di codice usando un XMLParser
o Regex
. Ho scritto un codice in Vb.net che utilizza Regex
e passa su .dtsx
file all'interno di una directory e ottenere il PackageFormatVersion
proprietà e altre proprietà trovate nell'intestazione del file dtsx:
- NomeFilePacchetto
- Versione PackageFormat
- Data di creazione
- Nomecreazione
- NomeComputer Creator
- Nome creatore
- ID DTS
- Tipo eseguibile
- LastModifiedProductVersion
- ID locale
- Nome oggetto
- Tipo Pacchetto
- VersionBuild
- VersioneGUID
Per prima cosa ho creato una classe 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"">)(.*)(?=</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 seguente riga di codice è quella che legge PackageFormatVersion
proprietà dal file
Dim strA As String = Regex.Match(strContent, "(?<=""PackageFormatVersion"">)(.*)(?=</DTS:Property>)", 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 realizzare questa procedura è possibile scaricarla dal seguente link:
- Link per il download di Dropbox
Inoltre ho creato un nuovo repository Git per questa app demo
Schermata dell'app
Ottenere valori da file .dtsx usando TSQL
Puoi leggere la mia risposta su DBA.StackExchange:
- Determina PackageFormatVersion per più file di pacchetti .DTSX in una cartella
Tabella PackageFormatVersion
Ed ecco il PackageFormatVersion
valori della tabella
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