3

目的: SSIS パッケージにあるすべてのユーザー変数を取得し、変数名とその値を SQL Server 2008 テーブルに書き込みます。

私が試したこと:変数名とその値を表示するために機能する小さな「スクリプトタスク」を取得しました。スクリプトは次のとおりです。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_81ec2398155247148a7dad513f3be99d.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    public void Main()
    {


        Microsoft.SqlServer.Dts.Runtime.Application app = new Microsoft.SqlServer.Dts.Runtime.Application();
        Package pkg = app.LoadPackage(
          @"C:\package.dtsx",
          null);
        Variables pkgVars = pkg.Variables;

        foreach (Variable pkgVar in pkgVars)
        {
            if (pkgVar.Namespace.ToString() == "User")
            {
                MessageBox.Show(pkgVar.Name);
                MessageBox.Show(pkgVar.Value.ToString());
            }
        }
        Console.Read();
    }
    }

    }

必要な作業:これを取得して、値をデータベース テーブルにダンプする必要があります。このためのスクリプト コンポーネントに取り組もうとしていますが、.net スクリプトの知識が不足しているため、ゴールに近づくことはできませんでした。これは私がコンポーネント側で行ったことです。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.SqlServer.Dts;
using System.Windows.Forms;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{

   public override void CreateNewOutputRows()
    {

        #region Class Variables
        IDTSVariables100 variables;
        #endregion

        variables = null;

        this.VariableDispenser.GetVariables(out variables);
        foreach(Variable myVar in variables)
        {
            MessageBox.Show(myVar.Value.ToString());
            if (myVar.Namespace == "User")
            {
                Output0Buffer.ColumnName = myVar.Value.ToString();
            }
        }
    }

}
4

1 に答える 1

3

私は今この問題を解決する2つの方法を考えることができます。

  1. 同じスクリプトタスクを使用して、データベースに値を挿入します
  2. Foreachループを使用してssisパッケージ変数を列挙します(あなたが尋ねたように)

変数名と値を挿入するためのテーブルスクリプトは

CREATE TABLE [dbo].[SSISVariables]
(
[Name] [varchar](50) NULL,
[Value] [varchar](50) NULL
)

1.Script task以下のコードを使用して記述します

[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
    private static string m_connectionString = @"Data Source=Server Name;
    Initial Catalog=Practice;Integrated Security=True";
   public void Main()
    {
       List<SSISVariable> _coll = new List<SSISVariable>();
        Microsoft.SqlServer.Dts.Runtime.Application app = new Microsoft.SqlServer.Dts.Runtime.Application();
        Package pkg = app.LoadPackage(PackageLocation,Null);
                   Variables pkgVars = pkg.Variables;

        foreach (Variable pkgVar in pkgVars)
        {
            if (pkgVar.Namespace.ToString() == "User")
            {
                _coll.Add(new SSISVariable ()
                {
                 Name =pkgVar.Name.ToString(),
                 Val =pkgVar .Value.ToString () 
                });
           }
        }
        InsertIntoTable(_coll);
        Dts.TaskResult = (int)ScriptResults.Success;
    }

    public void InsertIntoTable(List<SSISVariable> _collDetails)
    {  
       using (SqlConnection conn = new SqlConnection(m_connectionString))
        {
            conn.Open();
            foreach (var item in _collDetails )
            {
             SqlCommand command = new SqlCommand("Insert into SSISVariables values (@name,@value)", conn);
             command.Parameters.Add("@name", SqlDbType.VarChar).Value = item.Name ;

             command.Parameters.Add("@value", SqlDbType.VarChar).Value = item.Val ;
             command.ExecuteNonQuery();    
            }
        }
     }
  }

   public class SSISVariable
   {
    public string Name { get; set; }
    public string Val { get; set; }
   }

説明:これでは、NameプロパティとValプロパティを持つクラスを作成しています。コードを使用してパッケージ変数とその値を取得し、コレクションに格納します。次にList<SSISVariable>、このコレクションをメソッド()に渡します。メソッド(InsertIntoTable)は、コレクションを列挙して値をデータベースに挿入するだけです。

ノート :

There is a performance issue with the above code ,as for every variable 
im hitting the database and inserting the value.You can use
[TVP][1]( SQL Server 2008)   or stored procedure which takes
 xml( sql server 2005) as input. 

2.ForEachループの使用

設計

ここに画像の説明を入力してください

ステップ1:Foreachループからの結果を格納するために、型の変数とVariableCollectionSystem.Objectの別の変数を作成しますItemString

ステップ2:最初のスクリプトタスクの場合。

VariableCollection変数名とその値を格納するために使用されます ここに画像の説明を入力してください

ステップ3:スクリプトタスク内Main Methodに次のコードを記述します

  public void Main()
   {
     ArrayList _coll = new ArrayList(); 

        Microsoft.SqlServer.Dts.Runtime.Application app = new Microsoft.SqlServer.Dts.Runtime.Application();
        Package pkg = app.LoadPackage(Your Package Location,null);

        Variables pkgVars = pkg.Variables;
        foreach (Variable pkgVar in pkgVars)
        {
            if (pkgVar.Namespace.ToString() == "User")
            {
                _coll.Add(string.Concat ( pkgVar.Name,',',pkgVar.Value ));
            }
        }
        Dts.Variables["User::VariableCollection"].Value = _coll;
        // TODO: Add your code here
        Dts.TaskResult = (int)ScriptResults.Success;
    }

ステップ4:Foreachループをドラッグし、式で使用するForeach from Variable Enumerator

ここに画像の説明を入力してください

ステップ5:Foreachループは値を列挙し、それを変数に格納しますUser::Item

ここに画像の説明を入力してください

ステップ6:foreachループ内で、スクリプトタスクをドラッグし、変数を選択します

readonly variables   User::Item 

ステップ7:mainメソッドで以下のコードを記述します

   public void Main()
    {
      string name = string.Empty;
      string[] variableCollection;
      variableCollection = Dts.Variables["User::Item"].Value.ToString().Split(',');
      using (SqlConnection conn = new SqlConnection(m_connectionString))
        {
            conn.Open();
            SqlCommand command = new SqlCommand("Insert into SSISVariables values (@name,@value)", conn);
            command.Parameters.Add("@name", SqlDbType.VarChar).Value = variableCollection[0];

            command.Parameters.Add("@value", SqlDbType.VarChar).Value = variableCollection[1];

            command.ExecuteNonQuery();
        }
        // TODO: Add your code here
        Dts.TaskResult = (int)ScriptResults.Success;
    }

説明:Foreachループでは、1つの変数しか列挙できません。したがって、ロジックは、変数名とその値を1つの変数に渡す必要があります。このために、名前と値を連結しました。

 string.Concat ( pkgVar.Name,',',pkgVar.Value )

foreachループのスクリプトタスクは、変数を分割して文字列の配列に格納するだけで、配列インデックスを使用して名前と値にアクセスし、データベースに格納できます。

于 2012-08-04T17:10:00.383 に答える