3

我知道我可以编辑每个单独的 DTS 包并将其保存为 Visual Basic 脚本,但是服务器上有数百个包,这将需要很长时间。如何一次编写所有脚本?我希望能够为每个包创建一个文件,以便我可以将它们签入源代码控制,搜索它们以查看哪个引用了特定表,或者将开发服务器上的包与生产服务器上的包进行比较。

4

4 回答 4

2

我最终挖掘了 SQL 2000 文档(构建 SQL Server 应用程序/DTS 编程/编程 DTS 应用程序/DTS 对象模型)并创建了一个 VBS 脚本来读取包和编写 XML 文件。它并不完整,可以通过多种方式进行改进,但这是一个很好的开始:

GetPackages.vbs

选项显式

子 GetProperties(strPackageName、dtsProperties、xmlDocument、xmlProperties)
    Dim dtsProperty

    如果不是 dtsProperties 什么都不是,那么
        对于 dtsProperties 中的每个 dtsProperty
            如果 dtsProperty.Set 然后
                暗淡 xmlProperty
                设置 xmlProperty = xmlProperties.insertBefore (_
                    xmlDocument.createElement(“属性”),_
                    xmlProperties.selectSingleNode ("Property[@Name > '" & dtsProperty.Name & "']"))

                '特性
                'xmlProperty.setAttribute "Get", dtsProperty.Get
                'xmlProperty.setAttribute "Set", dtsProperty.Set
                xmlProperty.setAttribute "类型", dtsProperty.Type
                xmlProperty.setAttribute "名称", dtsProperty.Name

                如果不是 isnull(dtsProperty.Value) 则
                    xmlProperty.setAttribute "值", dtsProperty.Value
                万一

                '集合
                '获取属性的属性会导致堆栈溢出
                'GetProperties strPackageName, dtsProperty.Properties, xmlDocument, xmlProperty.appendChild (xmlDocument.createElement ("Properties"))
            万一
        下一个
    万一
结束子

子 GetOLEDBProperties (strPackageName, dtsOLEDBProperties, xmlDocument, xmlOLEDBProperties)
    暗淡 dtsOLEDB 属性

    对于 dtsOLEDBProperties 中的每个 dtsOLEDBProperty
        如果 dtsOLEDBProperty.IsDefaultValue = 0 那么
            暗淡 xmlOLEDB 属性
            设置 xmlOLEDBProperty = xmlOLEDBProperties.insertBefore (_
                xmlDocument.createElement ("OLEDBProperty"), _
                xmlOLEDBProperties.selectSingleNode ("OLEDBProperty[@Name > '" & dtsOLEDBProperty.Name & "']"))

            '特性
            xmlOLEDBProperty.setAttribute “名称”,dtsOLEDBProperty.Name
            'xmlOLEDBProperty.setAttribute "PropertyID", dtsOLEDBProperty.PropertyID
            'xmlOLEDBProperty.setAttribute "PropertySet", dtsOLEDBProperty.PropertySet
            xmlOLEDBProperty.setAttribute“值”,dtsOLEDBProperty.Value
            'xmlOLEDBProperty.setAttribute "IsDefaultValue", dtsOLEDBProperty.IsDefaultValue

            '集合
            '这些属性和上面的一样
            'GetProperties strPackageName, dtsOLEDBProperty.Properties, xmlDocument, xmlOLEDBProperty.appendChild (xmlDocument.createElement ("Properties"))
        万一
    下一个
结束子

子 GetConnections (strPackageName, dtsConnections, xmlDocument, xmlConnections)
    暗淡 dtsConnection2

    对于 dtsConnections 中的每个 dtsConnection2
        暗淡xmlConnection2
        设置 xmlConnection2 = xmlConnections.insertBefore (_
            xmlDocument.createElement ("Connection2"), _
            xmlConnections.selectSingleNode ("Connection2[@Name > '" & dtsConnection2.Name & "']"))

        '特性
        xmlConnection2.setAttribute "ID", dtsConnection2.ID
        xmlConnection2.setAttribute "名称", dtsConnection2.Name
        xmlConnection2.setAttribute "ProviderID", dtsConnection2.ProviderID

        '集合
        GetProperties strPackageName, dtsConnection2.Properties, xmlDocument, xmlConnection2.appendChild (xmlDocument.createElement ("Properties"))

        调暗 dtsOLEDB 属性
        出错时继续下一步
        设置 dtsOLEDBProperties = dtsConnection2.ConnectionProperties

        如果 Err.Number = 0 那么
            出错时转到 0
            GetOLEDBProperties strPackageName, dtsOLEDBProperties, xmlDocument, xmlConnection2.appendChild (xmlDocument.createElement ("ConnectionProperties"))
        别的
            MsgBox Err.Description & vbCrLf & "ProviderID: " & dtsConnection2.ProviderID & vbCrLf & "连接名称: " & dtsConnection2.Name, , strPackageName
            出错时转到 0
        万一

    下一个
结束子

子 GetGlobalVariables (strPackageName, dtsGlobalVariables, xmlDocument, xmlGlobalVariables)
    暗淡 dtsGlobalVariable2

    对于 dtsGlobalVariables 中的每个 dtsGlobalVariable2
        暗淡 xmlGlobalVariable2
        设置 xmlGlobalVariable2 = xmlGlobalVariables.insertBefore (_
            xmlDocument.createElement ("GlobalVariable2"), _
            xmlGlobalVariables.selectSingleNode ("GlobalVariable2[@Name > '" & dtsGlobalVariable2.Name & "']"))

        '特性
        xmlGlobalVariable2.setAttribute "名称", dtsGlobalVariable2.Name

        If Not Isnull(dtsGlobalVariable2.Value) Then
            xmlGlobalVariable2.setAttribute "Value", dtsGlobalVariable2.Value
        万一

        '没有扩展属性

        '集合
        'GetProperties strPackageName, dtsGlobalVariable2.Properties, xmlDocument, xmlGlobalVariable2.appendChild (xmlDocument.createElement ("Properties"))
    下一个
结束子

子 GetSavedPackageInfos (strPackageName, dtsSavedPackageInfos, xmlDocument, xmlSavedPackageInfos)
    暗淡 dtsSavedPackageInfo

    对于 dtsSavedPackageInfos 中的每个 dtsSavedPackageInfo
        暗淡 xmlSavedPackageInfo
        设置 xmlSavedPackageInfo = xmlSavedPackageInfos.appendChild (xmlDocument.createElement ("SavedPackageInfo"))

        '特性
        xmlSavedPackageInfo.setAttribute "描述",dtsSavedPackageInfo.Description
        xmlSavedPackageInfo.setAttribute "IsVersionEncrypted", dtsSavedPackageInfo.IsVersionEncrypted
        xmlSavedPackageInfo.setAttribute "PackageCreationDate", dtsSavedPackageInfo.PackageCreationDate
        xmlSavedPackageInfo.setAttribute "PackageID", dtsSavedPackageInfo.PackageID
        xmlSavedPackageInfo.setAttribute "PackageName", dtsSavedPackageInfo.PackageName
        xmlSavedPackageInfo.setAttribute "VersionID", dtsSavedPackageInfo.VersionID
        xmlSavedPackageInfo.setAttribute "VersionSaveDate", dtsSavedPackageInfo.VersionSaveDate
    下一个
结束子

子 GetPrecedenceConstraints (strPackageName, dtsPrecedenceConstraints, xmlDocument, xmlPrecedenceConstraints)
    暗淡 dtsPrecedenceConstraint

    对于 dtsPrecedenceConstraints 中的每个 dtsPrecedenceConstraint
        暗淡xmlPrecedenceConstraint
        设置 xmlPrecedenceConstraint = xmlPrecedenceConstraints.insertBefore (_
            xmlDocument.createElement ("PrecedenceConstraint"), _
            xmlPrecedenceConstraints.selectSingleNode ("PrecedenceConstraint[@StepName > '" & dtsPrecedenceConstraint.StepName & "']"))

        '特性
        xmlPrecedenceConstraint.setAttribute "StepName", dtsPrecedenceConstraint.StepName

        '集合
        GetProperties strPackageName, dtsPrecedenceConstraint.Properties, xmlDocument, xmlPrecedenceConstraint.appendChild (xmlDocument.createElement ("Properties"))
    下一个
结束子

子 GetSteps (strPackageName, dtsSteps, xmlDocument, xmlSteps)
    调暗 dtsStep2

    对于 dtsSteps 中的每个 dtsStep2
        调暗 xmlStep2
        设置 xmlStep2 = xmlSteps.insertBefore (_
            xmlDocument.createElement ("Step2"), _
            xmlSteps.selectSingleNode ("Step2[@Name > '" & dtsStep2.Name & "']"))

        '特性
        xmlStep2.setAttribute "名称", dtsStep2.Name
        xmlStep2.setAttribute "描述", dtsStep2.Description

        '集合
        GetProperties strPackageName, dtsStep2.Properties, xmlDocument, xmlStep2.appendChild (xmlDocument.createElement ("Properties"))
        GetPrecedenceConstraints strPackageName, dtsStep2.PrecedenceConstraints, xmlDocument, xmlStep2.appendChild (xmlDocument.createElement ("PrecedenceConstraints"))
    下一个
结束子

子 GetColumns (strPackageName, dtsColumns, xmlDocument, xmlColumns)
    调暗 dtsColumn

    对于 dtsColumns 中的每个 dtsColumn
        暗淡 xmlColumn
        设置 xmlColumn = xmlColumns.appendChild (xmlDocument.createElement ("Column"))

        GetProperties strPackageName, dtsColumn.Properties, xmlDocument, xmlColumn.appendChild (xmlDocument.createElement ("Properties"))
    下一个
结束子

子 GetLookups (strPackageName, dtsLookups, xmlDocument, xmlLookups)
    暗淡 dtsLookup

    对于 dtsLookups 中的每个 dtsLookup
        暗淡 xmlLookup
        设置 xmlLookup = xmlLookups.appendChild (xmlDocument.createElement ("Lookup"))

        GetProperties strPackageName, dtsLookup.Properties, xmlDocument, xmlLookup.appendChild (xmlDocument.createElement ("Properties"))
    下一个
结束子

子 GetTransformations (strPackageName, dtsTransformations, xmlDocument, xmlTransformations)
    Dim dtsTransformation

    对于 dtsTransformations 中的每个 dtsTransformation
        暗淡 xmlTransformation
        设置 xmlTransformation = xmlTransformations.appendChild (xmlDocument.createElement ("Transformation"))

        GetProperties strPackageName, dtsTransformation.Properties, xmlDocument, xmlTransformation.appendChild (xmlDocument.createElement ("Properties"))
    下一个
结束子

子 GetTasks (strPackageName, dtsTasks, xmlDocument, xmlTask​​s)
    调暗 dtsTask

    对于 dtsTasks 中的每个 dtsTask
        暗淡xml任务
        设置 xmlTask​​ = xmlTask​​s.insertBefore (_
            xmlDocument.createElement(“任务”),_
            xmlTask​​s.selectSingleNode ("Task[@Name > '" & dtsTask.Name & "']"))

        ' 任务可以是任何类型的任务,每种类型的任务都有不同的属性。

        '特性
        xmlTask​​.setAttribute "CustomTaskID", dtsTask.CustomTaskID
        xmlTask​​.setAttribute "名称", dtsTask.Name
        xmlTask​​.setAttribute "描述", dtsTask.Description

        '集合
        GetProperties strPackageName, dtsTask.Properties, xmlDocument, xmlTask​​.appendChild (xmlDocument.createElement ("Properties"))

        如果 dtsTask.CustomTaskID = "DTSDataPumpTask" 那么
            GetOLEDBProperties strPackageName, dtsTask.CustomTask.SourceCommandProperties, xmlDocument, xmlTask​​.appendChild (xmlDocument.createElement ("SourceCommandProperties"))
            GetOLEDBProperties strPackageName, dtsTask.CustomTask.DestinationCommandProperties, xmlDocument, xmlTask​​.appendChild (xmlDocument.createElement ("DestinationCommandProperties"))
            GetColumns strPackageName, dtsTask.CustomTask.DestinationColumnDefinitions, xmlDocument, xmlTask​​.appendChild (xmlDocument.createElement ("DestinationColumnDefinitions"))
            GetLookups strPackageName, dtsTask.CustomTask.Lookups, xmlDocument, xmlTask​​.appendChild (xmlDocument.createElement ("Lookups"))
            GetTransformations strPackageName, dtsTask.CustomTask.Transformations, xmlDocument, xmlTask​​.appendChild (xmlDocument.createElement ("Transformations"))
        万一
    下一个
结束子

子 FormatXML(xmlDocument、xmlElement、intIndent)
    暗淡 xmlSubElement

    对于 xmlElement.selectNodes ("*") 中的每个 xmlSubElement
        xmlElement.insertBefore xmlDocument.createTextNode (vbCrLf & String (intIndent + 1, vbTab)), xmlSubElement
        FormatXML xmlDocument、xmlSubElement、intIndent + 1
    下一个

    如果 xmlElement.selectNodes ("*").length > 0 那么
        xmlElement.appendChild xmlDocument.createTextNode (vbCrLf & String (intIndent, vbTab))
    万一
结束子

子 GetPackage (strServerName, strPackageName)
    调暗 dtsPackage2
    设置 dtsPackage2 = CreateObject ("DTS.Package2")

    暗淡 DTSSQLStgFlag_Default
    暗淡 DTSSQLStgFlag_UseTrustedConnection

    DTSSQLStgFlag_Default = 0
    DTSSQLStgFlag_UseTrustedConnection = 256

    出错时继续下一步
    dtsPackage2.LoadFromSQLServer strServerName, , , DTSSQLStgFlag_UseTrustedConnection, , , , strPackageName

    如果 Err.Number = 0 那么
        出错时转到 0
        'fsoTextStream.WriteLine dtsPackage2.Name

        暗淡xml文档
        设置 xmlDocument = CreateObject ("Msxml2.DOMDocument.3.0")

        暗淡xmlPackage2
        设置 xmlPackage2 = xmlDocument.appendChild (xmlDocument.createElement ("Package2"))

        '特性
        xmlPackage2.setAttribute "名称", dtsPackage2.Name

        '集合
        GetProperties strPackageName, dtsPackage2.Properties, xmlDocument, xmlPackage2.appendChild (xmlDocument.createElement("Properties"))
        GetConnections strPackageName, dtsPackage2.Connections, xmlDocument, xmlPackage2.appendChild (xmlDocument.createElement ("Connections"))
        GetGlobalVariables strPackageName, dtsPackage2.GlobalVariables, xmlDocument, xmlPackage2.appendChild (xmlDocument.createElement ("GlobalVariables"))
        'SavedPackageInfos 仅适用于结构化存储文件中保存的 DTS 包
        'GetSavedPackageInfos strPackageName, dtsPackage2.SavedPackageInfos, xmlDocument, xmlPackage2.appendChild (xmlDocument.createElement ("SavedPackageInfos"))
        GetSteps strPackageName, dtsPackage2.Steps, xmlDocument, xmlPackage2.appendChild (xmlDocument.createElement ("Steps"))
        GetTasks strPackageName, dtsPackage2.Tasks, xmlDocument, xmlPackage2.appendChild (xmlDocument.createElement ("Tasks"))

        FormatXML xmlDocument, xmlPackage2, 0
        xmlDocument.save strPackageName + ".xml"
    别的
        MsgBox Err.Description, , strPackageName
        出错时转到 0
    万一
结束子

子主
    暗淡 strServerName
    strServerName = Trim (InputBox ("Server:"))

    如果 strServerName "" 那么
        昏暗 cnSQLServer
        设置 cnSQLServer = CreateObject ("ADODB.Connection")
        cnSQLServer.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=msdb;Data Source="&strServerName

        Dim rsDTS包
        设置 rsDTSPackages = cnSQLServer.Execute ("SELECT DISTINCT name FROM sysdtspackages ORDER BY name")

        暗淡 strPackageNames

        不做 rsDTSPackages.EOF
            GetPackage strServerName,rsDTSPackages(“名称”)
            rsDTSPackages.MoveNext
        环形

        rsDTSPackages.关闭
        设置 rsDTSPackages = 无

        cnSQLServer.关闭
        设置 cnSQLServer = 无

        暗淡 strCustomTaskIDs
        暗淡 strCustomTaskID

        MsgBox "完成", , "GetPackages.vbs"
    万一
结束子

主要的
于 2008-09-29T22:13:42.963 回答
0

为了完整起见,我启动了另一个 VBS 脚本来读取由 GetPackages.vbs 生成的 XML 文件,并将其作为 DTS 包保存在另一个 SQL Server 上。这更不完整,但我希望它最终会有用。

PushPackages.vbs

选项显式

子集属性(dtsProperties、xmlProperties)
    暗淡的 xml 属性

    对于 xmlProperties.selectNodes 中的每个 xmlProperty ("Property[@Set='-1']")
        dtsProperties.Item (xmlProperty.getAttribute ("Name")).Value = xmlProperty.getAttribute ("Value")
    下一个
结束子

子集OLEDBProperties(dtsOLEDBProperties、xmlOLEDBProperties)
    暗淡的 xmlOLEDB 属性

    对于 xmlOLEDBProperties.selectNodes ("OLEDBProperty") 中的每个 xmlOLEDBProperty
        dtsOLEDBProperties.Item (xmlOLEDBProperty.getAttribute ("Name")).Value = xmlOLEDBProperty.getAttribute ("Value")
    下一个
结束子

子集连接(dtsConnections、xmlConnections)
    暗淡 dtsConnection2
    昏暗的xmlConnection2

    对于 xmlConnections.selectNodes ("Connection2") 中的每个 xmlConnection2
        设置 dtsConnection2 = dtsConnections.New (xmlConnection2.getAttribute ("ProviderID"))
        SetProperties dtsConnection2.Properties,xmlConnection2.selectSingleNode(“属性”)
        SetOLEDBProperties dtsConnection2.ConnectionProperties, xmlConnection2.selectSingleNode ("ConnectionProperties")
        dtsConnections.Add dtsConnection2
    下一个
结束子

子集全局变量(dtsGlobalVariables、xmlGlobalVariables)
    昏暗的 xmlGlobalVariable2

    对于 xmlGlobalVariables.selectNodes ("GlobalVariable2") 中的每个 xmlGlobalVariable2
        dtsGlobalVariables.AddGlobalVariable xmlGlobalVariable2.getAttribute(“名称”),xmlGlobalVariable2.getAttribute(“值”)
    下一个
结束子

子集PrecedenceConstraints (dtsPrecedenceConstraints, xmlPrecedenceConstraints)
    暗淡的xmlPrecedenceConstraint
    暗淡 dtsPrecedenceConstraint

    对于 xmlPrecedenceConstraints.selectNodes ("PrecedenceConstraint") 中的每个 xmlPrecedenceConstraint
        设置 dtsPrecedenceConstraint = dtsPrecedenceConstraints.New (xmlPrecedenceConstraint.getAttribute ("StepName"))
        SetProperties dtsPrecedenceConstraint.Properties,xmlPrecedenceConstraint.selectSingleNode(“属性”)
        dtsPrecedenceConstraints.Add dtsPrecedenceConstraint
    下一个
结束子

子集步骤(dtsSteps,xmlSteps)
    昏暗的xmlStep2
    暗淡 dtsStep2

    对于 xmlSteps.selectNodes ("Step2") 中的每个 xmlStep2
        设置 dtsStep2 = dtsSteps.New
        SetProperties dtsStep2.Properties,xmlStep2.selectSingleNode(“属性”)
        dtsSteps.添加 dtsStep2
    下一个

    对于 xmlSteps.selectNodes ("Step2") 中的每个 xmlStep2
        设置 dtsStep2 = dtsSteps.Item (xmlStep2.getAttribute ("Name"))
        SetPrecedenceConstraints dtsStep2.PrecedenceConstraints, xmlStep2.selectSingleNode ("PrecedenceConstraints")
    下一个
结束子

子集任务(dtsTasks、xmlTask​​s)
    暗淡的xmlTask
    暗淡 dtsTask

    对于 xmlTask​​s.selectNodes ("Task") 中的每个 xmlTask
        设置 dtsTask = dtsTasks.New (xmlTask​​.getAttribute ("CustomTaskID"))
        SetProperties dtsTask.Properties,xmlTask​​.selectSingleNode(“属性”)
        dtsTasks.Add dtsTask
    下一个
结束子

子 CreatePackage (strServerName, strFileName)
    暗淡 fsoFileSystem
    设置 fsoFileSystem = CreateObject ("Scripting.FileSystemObject")

    调暗 dtsPackage2
    设置 dtsPackage2 = CreateObject ("DTS.Package2")

    暗淡 DTSSQLStgFlag_Default
    暗淡 DTSSQLStgFlag_UseTrustedConnection

    DTSSQLStgFlag_Default = 0
    DTSSQLStgFlag_UseTrustedConnection = 256

    暗淡xml文档
    设置 xmlDocument = CreateObject ("Msxml2.DOMDocument.3.0")
    xmlDocument.load strFileName

    暗淡xmlPackage2
    设置 xmlPackage2 = xmlDocument.selectSingleNode ("Package2")

    '特性
    SetProperties dtsPackage2.Properties,xmlPackage2.selectSingleNode(“属性”)

    '集合
    SetConnections dtsPackage2.Connections,xmlPackage2.selectSingleNode(“连接”)
    SetGlobalVariables dtsPackage2.GlobalVariables, xmlPackage2.selectSingleNode ("GlobalVariables")
    SetSteps dtsPackage2.Steps,xmlPackage2.selectSingleNode(“步骤”)
    SetTasks dtsPackage2.Tasks,xmlPackage2.selectSingleNode(“任务”)

    出错时继续下一步
    dtsPackage2.SaveToSQLServer strServerName, , , DTSSQLStgFlag_UseTrustedConnection

    If Err.Number Then
        MsgBox Err.Description
    万一
结束子

子主
    暗淡 strServerName
    暗淡的 strFileName

    如果 WScript.Arguments.Count 2 则
        MsgBox "用法:PushPackages 服务器名文件名"
    别的
        strServerName = WScript.Arguments (0)
        strFileName = WScript.Arguments (1)
        CreatePackage strServerName, strFileName
    万一
结束子

主要的
于 2008-09-29T22:20:29.203 回答
0

这个工具 ( DTSDoc ) 在记录 DTS 包方面做得很好。它可以从命令行运行,这对于保持文档的最新状态非常有用。它有一些正面评价:

由 ASP 联盟审查

Mike Gunderloy (LARKWARE) 的评论

于 2008-10-20T11:09:54.430 回答
0

您可以尝试使用系统表 sysdtspackages,如 sqldts.com 在Transfering DTS Packages中的演示。
此外,在新版本激增之前,曾经有许多工具可用于 MS SQL 2000。我在 Red Gate Labs 找到了一个名为DTS Package Compare的免费下载。

于 2008-09-18T02:00:13.553 回答