【问题标题】:How to use a string content as a variable name in a SSIS C# script如何在 SSIS C# 脚本中使用字符串内容作为变量名
【发布时间】:2016-11-05 22:50:03
【问题描述】:

大家好,感谢您的时间和提前回答。 让我先给你一些背景: 我在一家银行的度量项目中工作。我们正在重新设计商业部门的所有 ETL 流程和微观策略仪表板,它们使用大量非 IT 数据源,我们必须将这些信息映射到 SQL Server 2008R2 服务器中的 IT 集中式源。对于 ETL,我们使用 SSIS

我有一个用于贷款的 ETL。在一个数据流中,我收集了我需要的关于贷款的所有信息,然后从一个特定的表中我得到了所有需要测试的条件来对贷款进行分类。条件表有这种形式:

sk_condition_name: varchar
sk_whatever: ...
...
where_clause: varchar(900)

"where_clause" 列中,我有一个 where 子句(呃!),它可以像这样测试贷款中的一些列:

loan_type = x AND client_tipe = y AND loan_rate = z

在深入讨论之前,我需要说明的是,我举的例子是关于贷款的,但银行销售的所有产品也是如此,比如保险或投资基金...... 并且 对产品进行分类的条件会随时间改变并且一个特定的贷款可以通过多种方式同时进行分类,每个正分类都会在特定表中写入一行,这就是为什么我需要一个异步脚本组件

我在哪里?对,贷款.. 所以在 ETL 中获取所有贷款数据和那些 where_clauses,在 C# 脚本组件中,我们用正则表达式分隔子句,所以我们最终为子句所做的每次检查使用 2 个字符串,使用上面的例子我会得到3对字符串(“loan_type”,“x”),(“client_type”,“y”)和(“loan_rate”,z)。

这就是问题所在

我在脚本中找不到使用第一个字符串内容作为行列名称的方法,我的意思是这样的:

if Row.(string1.content()) = string2 then ...

现在的限制:

  • 这是一家银行,他们不喜欢新事物,所以我可以使用的工具是 SSIS 的工具。
  • 模型中的更改可能不在讨论范围内,不在讨论范围内。
  • 我需要它是完全动态的,没有硬编码的条件,因为这些条件的性质不断变化。
  • 我已经搜索了很多解决方案,但发现无效。这是我最后的资源。

我希望我在这方面已经很清楚了,这是我的第一篇文章。

请帮帮我!

非常感谢!!

编辑 1:澄清..

我的最终结果是为每个测试为阳性的条件生成一个新行以插入到一个特定表中。要插入的信息和目标表与手中的问题无关。贷款类型、客户和利率只是条件测试的示例。我的问题是我不能使用字符串内容作为行列的名称。

【问题讨论】:

  • 您的问题并不完全清楚。您争取的最终结果是什么?您是否试图将loan_type、client_type 和loan_rate 作为三个单独的列?当你说 C# Script 时,你指的是 Script Task 还是 Script Component?
  • 检查这个link 我想这就是你要找的东西
  • @VKarthik 我的最终结果是为每个测试为阳性的条件生成一个要插入到一个特定表中的新行。要插入的信息和目标表与手中的问题无关。类型、客户和费率只是测试条件的示例。我的问题是我不能使用一个字符串内容作为行列的变量名。它是一个脚本组件。谢谢!
  • @H.Fadlallah 谢谢你的意见,但这不是我需要的。
  • 我现在明白了这个问题。我会发布更新。我正在分析它。

标签: c# ssis ssis-2008


【解决方案1】:

您可以使用反射来做到这一点。 添加“使用 System.Reflection;”到命名空间 - 然后您可以使用以下代码进行交互:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{

    string sColumn = "Name";
    string sFind = "John";

    foreach (PropertyInfo p in Row.GetType().GetProperties())
    {

        string sval;

        if (p.Name.ToString() == sColumn)
        {

            sval = p.GetValue(Row, null).ToString();

            if (sval != sFind) 
            {
                //Do Stuff
            }

        }


    }

}

在此示例中,我将 String1(要检查的列)硬编码为 Name,将 String2(要检查的值)硬编码为 John。

【讨论】:

  • 谢谢你,伙计!我必须添加一些 Trim() 和 ToLower() 才能使 ifs 正确,但它解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多