我有一个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#字符串中引用项目参数?提前谢谢!
答案 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变量来保存源查询并对其应用表达式,以便您手动将标记替换为项目参数的当前值。