在 SQL Server 表中转储 SSIS USER 变量名称和值
Posted
技术标签:
【中文标题】在 SQL Server 表中转储 SSIS USER 变量名称和值【英文标题】:Dump SSIS USER variable name and value in SQL Server table 【发布时间】:2012-07-26 14:31:35 【问题描述】:用途:获取 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();
【问题讨论】:
【参考方案1】:我现在能想到两种方法来解决这个问题。
-
使用相同的脚本任务将值插入数据库
使用 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 步:创建一个变量 VariableCollection
,它的类型为 System.Object
和另一个
变量Item
,其类型为String
,用于存储Foreach循环的结果
第 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
第七步:在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 循环中,我只能枚举一个变量。所以逻辑是,我需要以某种方式将变量名称及其值传递给一个变量。为此,我将名称和值连接起来
string.Concat ( pkgVar.Name,',',pkgVar.Value )
foreach 循环中的脚本任务只是将变量拆分并将其存储到字符串数组中,然后您可以使用数组索引访问名称和值并将其存储在数据库中
【讨论】:
感谢 Praveen 的回复。你在做什么是完全有道理的。在这里提出问题后,我想知道这种方法是否会记录运行时变量值?如果不测试您的代码,它是否能够处理运行时值? @RajivVarma:结果存储为对象数据类型。所以无论变量值是什么,上面的代码都应该工作。我已经用字符串和 int 变量进行了测试,它们工作得很好跨度> 我希望这会像我预期的那样工作,但看起来不像。我有一个执行 SQL 任务,它从表中返回计数并将该计数值存储在变量中。我跟踪了变量,看起来第一种方法只存储变量的静态值,而不是运行时间。 @RajivVarma :您实际上有 2 个相同 ssis 包的实例。一个从 BIDS 环境运行,另一个在相同的环境中使用脚本任务。在脚本任务中,您实际上是在加载一个包装它只是读取元数据(与运行时无关)。所以它显示静态值。 只是为了证明我没有虚张声势,在您的脚本任务中添加变量(在只读变量中),您使用执行 sql 任务(以查找计数)更改它。现在编写以下代码 MessageBox。 Show(Dts.Variables[User::YourCountVariable].Value.toString()) 。这实际上将打印计数而不是静态值以上是关于在 SQL Server 表中转储 SSIS USER 变量名称和值的主要内容,如果未能解决你的问题,请参考以下文章
SSIS 将所有 Paradox 表导入 SQL Server 2012
使用 ssis 包导入 excel 到 sql server 失败
如何使用 SSIS 将多个 Access 数据库导入 SQL Server