0

我有一个 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

但是错误消息显示

找不到别名“ProjectSSIS60”

. 请问如何在 C# 字符串中引用项目参数?先感谢您!

4

1 回答 1

0

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

首先是您已经在当前 Biml 层的范围内声明了项目参数,因此您还不能引用它。

第二个是您正在混合评估上下文。如果替换操作确实有效,那么您将创建一个 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 FROMdbo.? 如果您需要那种动态,那么您需要使用 SSIS 变量来保存您的源查询并对其应用表达式,以便您手动将令牌替换为当前值项目参数。

于 2018-01-31T18:55:01.160 回答