2016-10-20 24 views
2

DTSXパッケージ内のVBAスクリプトタスクにある多くの接続文字列とUNCファイルパスを変更する必要があります。DTSXパッケージのすべてのスクリプトタスクをプログラムで再コンパイルする必要があります。

大量の検索と置換を実行しましたが、このメソッドを使用してスクリプトタスクを変更すると、DTSXパッケージ実行中に実行されるバイナリは実行時に再コンパイルされず、検索と置換の変更は行われませんスクリプトタスクの実行に反映されます。

私はSQL Server 2008および2012でそれを行う方法についていくつかの記事を見つけましたが、ここではSQL Server 2014を使用しています。ここでのコード例は私にとっては役に立たない:(https://blogs.msdn.microsoft.com/jason_howell/2013/03/05/script-component-recompile-in-sql-server-2012-integration-services-ssis-to-refresh-metadata/)。

コメント内のいくつかの質問は私の問題を語っていますが、「このようにしてパスにナビゲートして参照を含める」のどれも私のために働いていません - これらのアセンブリは表示されません2008年から2012年にかけての変更、そして今私たちの2014年の変更、これらの図書館が私の配布に含まれるのかどうかは不明です。これらの変更を生かしてスクリプトタスクを再コンパイルする必要があります。 私は、各タスクのビルドを強制するために、すべてのスクリプトタスクを手動ですべてのパッケージで開く必要はないと考えています。

ありがとうございます。

+1

私は更新がある場合、あなたにお知らせします – Hackerman

+0

私はそれを達成することができました(ええ、私は天才のように感じています)....私はssisパッケージを読み込んですべてのスクリプトタスクを再コンパイルするVisualStudio 2013でVisual Basicを使用してWindowsフォームアプリケーションをビルドします....私はgoiです私が家に帰るときに答えを投稿するには: – Hackerman

+0

@Hackermanはあなたの解決を楽しみにしています。我々はまた、この要件に固執しています。 – dijikul

答えて

2

私はtwoレベルまでVisual Studio 2013C#を使用して、dtsxパッケージ内のすべてのScriptTaskを再コンパイルするためのコードnecesaryとConsoleアプリケーションを作成します。参照する必要があるすべてのアセンブリのパスは、コード内のコメントとして含まれています。 pkgLocationは、パッケージへのパスです(両端に私はWindows Formアプリを構築するが、これはベースと作業コードです:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 

    using Microsoft.SqlServer.Dts.Design; 
    using Microsoft.SqlServer.Dts.Runtime; 
    using Microsoft.SqlServer.Dts.Pipeline.Wrapper; 
    using Microsoft.SqlServer.Dts.Pipeline; 
    using Microsoft.SqlServer.VSTAHosting; 
    using Microsoft.SqlServer.IntegrationServices.VSTA; 
    using Microsoft.SqlServer.Dts.Tasks.ScriptTask; 
    using System.IO; 

    //Libraries 
    //C:\windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.Dts.Design\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Dts.Design.dll 
    //C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.DTSPipelineWrap.dll 
    //C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SQLServer.DTSRuntimeWrap.dll 
    //C:\windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.IntegrationServices.VSTA\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.IntegrationServices.VSTA.dll 
    //C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll 
    //C:\windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.PipelineHost\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SQLServer.PipelineHost.dll 
    //C:\windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.ScriptTask\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ScriptTask.dll 
    //C:\windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.TxScript\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.TxScript.dll 
    //C:\windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.VSTAScriptingLib\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.VSTAScriptingLib.dll 

    namespace recompApp 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       string pkgLocation; 
       Package pkg; 
       Application app; 

       //This is the folder where the test package lives!! 
       pkgLocation = 
       @"C:\TestPackage.dtsx"; 
       app = new Application(); 
       pkg = app.LoadPackage(pkgLocation, null); 
       //It's Alive!!!!!!! 
       try 
       { 

        Executables pExecs = pkg.Executables; 

        foreach (Executable pExec in pExecs) 
        { 
         switch (pExec.GetType().Name) 
         { 
          case "TaskHost":{ 
           TaskHost taskHost = (TaskHost)pExec; 
           Console.WriteLine("Executable name = " + taskHost.Name); 
           //Script Task Outside of a Sequence 
           if (taskHost.InnerObject.ToString().Equals("Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptTask")) 
           { 
            ScriptTask task = (ScriptTask)taskHost.InnerObject; 
            //Load the script project, build and save 
            task.ScriptingEngine.LoadProjectFromStorage(); 
            task.ScriptingEngine.VstaHelper.Build(""); 
            task.ScriptingEngine.SaveProjectToStorage(); 
            //Cleanup 
            task.ScriptingEngine.DisposeVstaHelper(); 
           }        
           break; 
          } 
          case "Sequence":{ 
           Executables seqExecs = ((Microsoft.SqlServer.Dts.Runtime.Sequence)(pExec)).Executables; 
           foreach(Executable seqExec in seqExecs){ 
            switch (seqExec.GetType().Name) 
            { 
             case "TaskHost": 
              { 
               TaskHost taskHost = (TaskHost)seqExec;   
               //Script Task inside a Sequence Container 
               if (taskHost.InnerObject.ToString().Equals("Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptTask")) 
               { 
                Console.WriteLine("Executable name = " + taskHost.Name); 
                ScriptTask task = (ScriptTask)taskHost.InnerObject; 
                //Load the script project, build and save 
                task.ScriptingEngine.LoadProjectFromStorage(); 
                task.ScriptingEngine.VstaHelper.Build(""); 
                task.ScriptingEngine.SaveProjectToStorage(); 
                //Cleanup 
                task.ScriptingEngine.DisposeVstaHelper(); 
               } 
               break; 
              } 
            } 
           } 
           break; 
          }       
         }      
        } 
        //Save the updated xml in the package 
        string xml; 
        pkg.SaveToXML(out xml, null); 
        File.WriteAllText(pkgLocation, xml); 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine(e.Message.ToString()); 
       } 

       Console.WriteLine("Press any key to exit..."); 
       Console.ReadKey(); 
      } 

     } 
    } 

私は、これは外の多くの人々を助け願っています私も​​3210を持っています。バージョン

+0

スクリプトのバリエーションを実行しました(データフロー内のスクリプトタスクをキャプチャして再コンパイルするため)、スクリプトを実行してファイルを変更しましたが、VSでパッケージを開くことができません。変更が適用されたことを確認すると、スクリプトコンポーネントの「バージョン」属性を「10」に変更するか、または SSIS_SC130を設定することによって発生したように見えます(Was SC120) – Brondahl

+0

これは最終的にはさまざまなDLLの正しいバージョンを取得する問題?あなたは、いつでも同様の問題に遭遇しましたか?あなたはアドバイスをしていますか? – Brondahl

+0

コメント欄には、プロジェクト作業を行うために参照する必要のあるすべてのDLLファイルがあります。また、Visual Studio 2013を使用しています... – Hackerman

関連する問題