如何在 SSIS C# 脚本中使用字符串内容作为变量名
How to use a string content as a variable name in a SSIS C# script
大家好,感谢您的宝贵时间和提前回答。
让我先给你一些背景:
我在一家银行的一个指标项目中工作。我们正在重新设计商业部门的所有 ETL 流程和微策略仪表板,它们使用大量非 IT 数据源,我们必须将该信息映射到 SQL Server 2008R2 中的 IT 集中源 服务器。对于 ETL,我们使用 SSIS。
我有一个用于贷款的 ETL。在数据流中,我收集了我需要的有关贷款的所有信息,然后从一个特定的 table 中获得了对贷款进行分类需要测试的所有条件。条件 table 具有以下形式:
sk_condition_name: varchar
sk_whatever: ...
...
where_clause: varchar(900)
在 "where_clause" 列中,我有一个 where 子句(duh!)测试贷款中的某些列,如下所示:
loan_type = x AND client_tipe = y AND loan_rate = z
在深入探讨之前,我需要说明的是,我举的例子是关于贷款的,但银行销售的所有产品也是如此,例如保险或投资基金...并且对产品进行分类的条件可以及时改变。 和一笔特定的贷款可以同时以多种方式分类,每个正分类在特定的table中写一行,这就是为什么我需要一个 异步脚本组件 .
我在哪里?对,贷款.. 所以在 ETL 中获取所有贷款数据和那些 where_clauses,在 C# 脚本组件中,我们用正则表达式分隔子句,所以我们最终得到 2 个字符串来检查子句是这样做,使用上面的例子我最终会得到 3 对字符串 ("loan_type", "x"), ("client_type","y") 和 ("loan_rate", z).
这就是问题所在
我在脚本中找不到使用第一个字符串内容作为行列名称的方法,我的意思是这样的:
if Row.(string1.content()) = string2 then ...
现在限制:
- 是银行,他们不喜欢新鲜事物,所以我能用的工具就是SSIS的那些。
- 模型的变化可能不在讨论之列,不在讨论之列。
- 我需要它是完全动态的,没有硬编码条件,因为这种条件的性质不断变化。
- 我搜索了很多解决方案,但没有找到有效的方法。这是我最后的资源。
我希望我在这方面已经很清楚了,这是我的第一个 post。
拜托拜托拜托了!
非常感谢!!
编辑 1: 澄清..
我的最终结果是为每个测试为阳性的条件生成一个新行以插入一个特定的 table。要插入的信息和目标table与手上的问题无关。贷款类型、客户和利率只是条件测试的示例。我的问题是我不能使用字符串内容作为行列的名称。
你可以用反射来做到这一点。
将 "using 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。
大家好,感谢您的宝贵时间和提前回答。 让我先给你一些背景: 我在一家银行的一个指标项目中工作。我们正在重新设计商业部门的所有 ETL 流程和微策略仪表板,它们使用大量非 IT 数据源,我们必须将该信息映射到 SQL Server 2008R2 中的 IT 集中源 服务器。对于 ETL,我们使用 SSIS。
我有一个用于贷款的 ETL。在数据流中,我收集了我需要的有关贷款的所有信息,然后从一个特定的 table 中获得了对贷款进行分类需要测试的所有条件。条件 table 具有以下形式:
sk_condition_name: varchar
sk_whatever: ...
...
where_clause: varchar(900)
在 "where_clause" 列中,我有一个 where 子句(duh!)测试贷款中的某些列,如下所示:
loan_type = x AND client_tipe = y AND loan_rate = z
在深入探讨之前,我需要说明的是,我举的例子是关于贷款的,但银行销售的所有产品也是如此,例如保险或投资基金...并且对产品进行分类的条件可以及时改变。 和一笔特定的贷款可以同时以多种方式分类,每个正分类在特定的table中写一行,这就是为什么我需要一个 异步脚本组件 .
我在哪里?对,贷款.. 所以在 ETL 中获取所有贷款数据和那些 where_clauses,在 C# 脚本组件中,我们用正则表达式分隔子句,所以我们最终得到 2 个字符串来检查子句是这样做,使用上面的例子我最终会得到 3 对字符串 ("loan_type", "x"), ("client_type","y") 和 ("loan_rate", z).
这就是问题所在
我在脚本中找不到使用第一个字符串内容作为行列名称的方法,我的意思是这样的:
if Row.(string1.content()) = string2 then ...
现在限制:
- 是银行,他们不喜欢新鲜事物,所以我能用的工具就是SSIS的那些。
- 模型的变化可能不在讨论之列,不在讨论之列。
- 我需要它是完全动态的,没有硬编码条件,因为这种条件的性质不断变化。
- 我搜索了很多解决方案,但没有找到有效的方法。这是我最后的资源。
我希望我在这方面已经很清楚了,这是我的第一个 post。
拜托拜托拜托了!
非常感谢!!
编辑 1: 澄清..
我的最终结果是为每个测试为阳性的条件生成一个新行以插入一个特定的 table。要插入的信息和目标table与手上的问题无关。贷款类型、客户和利率只是条件测试的示例。我的问题是我不能使用字符串内容作为行列的名称。
你可以用反射来做到这一点。 将 "using 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。