如何将c#与BIML混合使用?

时间:2018-01-31 17:53:36

标签: c# biml

我有一个BIML文件,包括从SQL服务器获取sql字符串的C#脚本,以及可以自定义sql字符串的BIML项目参数,编码如下:

<Projects>
    <PackageProject Name="ProjectSSIS60">
      <Parameters>
        <Parameter Name="pTenantKey" Id="{3f8e0fe6-e8c4-4a6a-8fb3-ddf6bbeb63a6}" DataType="Int16">123</Parameter>
      </Parameters>
    </PackageProject>
</Projects>

<Packages>
    <#
    foreach(DataRow row in AllTables.Rows)
    {
        SqlSource = row["SqlSource"].ToString();
    #>
        <Package Name="LoadDim" ConstraintMode="Linear">
            <Tasks>
                <Dataflow Name="Dim">
                    <Transformations>
                        <OleDbSource ConnectionName="pConnectionOLTP" Name="SRC Dim">
                            <DirectInput><#=SqlSource.Replace("@[$Project::pTenantKey]", ProjectSSIS60::pTenantKey)#></DirectInput>
                        </OleDbSource>

......

我想用

<#=SqlSource.Replace("@[$Project::pTenantKey]", ProjectSSIS60::pTenantKey)#>

使用项目参数@[$Project::pTenantKey]替换返回的sql字符串中的关键字ProjectSSIS60::pTenantKey

但是错误消息显示

  

Alias'ProjectSSIS60'未找到

。 如何在C#字符串中引用项目参数?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你遇到的挑战是双重的。

首先,您已在当前Biml层的范围内声明了Project Parameter,因此您无法引用它。

第二个是您正在混合评估上下文。如果Replace操作确实有效,那么您将创建一个SSIS包,其中包含对项目参数当前值的硬编码引用。

相反,我相信你的SqlSource看起来像是

SELECT * 
FROM dbo.MyTable AS T
WHERE T.TenantKey = @[$Project::pTenantKey]

如果是这种情况,你已经混合了参数化类型 - 很容易做到。

您已经指定这是一个OLEDB源,因此您将使用基于零序数的系统?作为占位符/令牌。上面的字符串应该成为

SELECT * 
FROM dbo.MyTable AS T
WHERE T.TenantKey = ?

然后,您将修改OleDbSource以获得<Parameters>部分,它看起来像

<Parameters>
    <Parameter Name="0" VariableName="@[$Project::pTenantKey]" />
</Parameters>

只要占位符在SELECT或WHERE子句中,这应该有效。

但是,您不能参数化源表ala FROM dbo.? 如果您需要这种动态,那么您需要使用SSIS变量来保存源查询并对其应用表达式,以便您手动将标记替换为项目参数的当前值。