2016-10-20 2 views
2

Наше продвижение нашего хранилища данных требует от нас изменить многие строки подключения и пути UNC-файлов, расположенные в VBA Script Tasks в пакетах DTSX.Необходимость программной перекомпиляции всех задач сценариев в пакетах 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 году, я не уверен, включены ли эти библиотеки в мой дистрибутив ...

Итак, у меня есть целая куча файлов DTSX в разных подкаталогах, которые требуют их задачи сценария должны быть перекомпилированы, чтобы мы могли жить с этими изменениями. Я надеюсь, что не придется открывать каждую задачу скрипта в каждом пакете вручную, чтобы заставить сборку каждой задачи.

Заранее благодарим за любые возможные решения!

+1

Я ищу что-то подобное .... если у меня есть какие-либо обновления, я дам вам знать – Hackerman

+0

Я смог это сделать (да,) .... Я создаю приложение Windows Form с Visual Basic на VisualStudio 2013, которое загружает пакет ssis и перекомпилирует каждую задачу скрипта .... Я goi ng, чтобы отправить ответ, когда я получу домой :) – Hackerman

+0

@Hackerman с нетерпением ждет вашего решения. Мы также придерживаемся этого требования. – dijikul

ответ

2

создать Console приложение с кодом necesary перекомпилировать каждый ScriptTask внутри dtsx пакета, используя Visual Studio 2013 и C# до two уровней. Путь для каждой сборки, на которую нужно ссылаться, включается в качестве комментариев в коде. 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(); 
      } 

     } 
    } 

Я надеюсь, что это помогает много людей вне меня также есть Visual Basic если вам это нужно.

+0

Я запустил вариант вашего скрипта (чтобы также захватить и перекомпилировать задачи сценария внутри потока данных), и скрипт запустил и изменил файл, но теперь я не могу открыть пакет в VS. Копаясь в применяемых изменениях, это вызвано изменением атрибута «Версия» компонента «Сценарий» на «10» и/или установкой SSIS_SC130 (был SC120) – Brondahl

+0

Я подозреваю, что это, в конечном счете, вопрос о получении правильных версий различных DLL? Вы сталкивались с подобными проблемами в любой момент, и есть ли у вас какие-либо советы? – Brondahl

+0

В разделе комментариев находятся все файлы DLL, которые вам нужны для ссылки, чтобы получить работу над проектом ... также я использую Visual Studio 2013 ... – Hackerman

Смежные вопросы