我正在使用BIML构建多个SSIS包,我必须在日期间隔之间从OLE DB源检索数据 . 这是要生成包的xml:
<Dataflow Name="DFT Insert into <#=TableName#>">
<Transformations>
<OleDbSource Name="Retreive from Source (<#=TableName#>)" ConnectionName="AS400">
<DirectInput>
SELECT s.*
FROM <#=TableSchema#>.<#=TableName#> s
WHERE s.date > ? AND s.date <= ?
</DirectInput>
<Parameters>
<Parameter Name="0" VariableName="User.StartDate"/>
<Parameter Name="1" VariableName="User.MiddleDate"/>
</Parameters>
</OleDbSource>
<OleDbDestination Name="Insert into Destination (<#=TableName#>)" ConnectionName="DB2Mirror" KeepNulls="true" CheckConstraints="false">
<ExternalTableOutput Table="[<#=TableSchema#>].[<#=TableName#>]" />
</OleDbDestination>
</Transformations>
</Dataflow>
这个结构通常会起作用,因为我已经尝试了它但是使用了ID(int)而不是date(string) . 我在尝试生成包时收到的错误如下:
Could not execute Query on Connection AS400
OleDbCommand.Prepare method requires all variable length parameters to have an explicitly set non-zero Size.
我知道我可以创建一个ssis变量并将查询中的日期连接为表达式,但我想坚持使用 <DirectInput>
而不是 <VariableInput>
附加信息
日期时间(对不起,我忘了提到它是日期时间,但我不确定格式没有任何问题,因为我试图创建一个变量作为表达式,连接这样的日期: <Variable Name="Query" DataType="String" EvaluateAsExpression="true">"SELECT * FROM table WHERE col > '" + @[User::StartDate] + "'"</Variable>
并且它有效 . 一件事我忘了提及,可能重要的是源dbms是db2
1 回答
给出以下表定义
这是我使用OLE DB Sources参数的最小,可行的Biml
那将构建一个包很好 . 如果我取出CDATA,它需要放弃大于/小于字符,它仍然有效
如果我没有用括号包装
Date
列,它仍然有效那么我的工作演示和你的演示之间还剩下什么?更容易解决的是日期的 Value (开始/中间日期) . 我使用yyyy-mm-dd aka ccyy-mm-dd往往被我使用的系统更普遍地理解,但你可能会尝试yyyymmdd的ISO标准 .
更难处理的事情是你的连接管理器被命名为AS400 . 事实上,因为我不得不在他们使用Julian dates的另一个问题上处理一个"weird"日期,但是我看到AS400使用了CYMD格式,这类似于"odd"并且你很难,但我不会冒险猜测丰富的可能日期格式 .