Ssis Ole db源上的BIML参数化查询
我正在用BIML构建多个SSIS包,我必须在一个日期间隔之间从OLE DB源检索数据。下面是将生成包的xml:Ssis Ole db源上的BIML参数化查询,ssis,biml,Ssis,Biml,我正在用BIML构建多个SSIS包,我必须在一个日期间隔之间从OLE DB源检索数据。下面是将生成包的xml: <Dataflow Name="DFT Insert into <#=TableName#>"> <Transformations> <OleDbSource Name="Retreive from Source (<#=TableName#>)" ConnectionName="AS400">
<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>
我知道我可以创建一个ssis变量并将查询中的日期作为表达式连接起来,但我希望使用
而不是
补充资料
变量中的datetime(抱歉,我忘了提到它是datetime,但我认为它变化不大)格式是正确的:yyyy-mm-dd hh:mm:ss。我很确定这种格式没有问题,因为我尝试创建一个变量作为表达式,将日期连接为:
“SELECT*FROM table WHERE col'+@[User::StartDate]+'”
,它可以工作。有一件事我忘了提到,而且可能很重要的是,给定下表定义,源dbms是一个db2
CREATE TABLE dbo.so_42623962
(
RowSk int NOT NULL
, [Date] date
);
这是我的最小可行Biml,它使用OLE DB源的参数
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection Name="tempdb" ConnectionString="Data Source=localhost\dev2016;Initial Catalog=tempdb;Provider=SQLNCLI11.0;Integrated Security=SSPI;"/>
</Connections>
<Packages>
<Package Name="so_42623962" >
<Variables>
<Variable Name="StartDate" DataType="String">2017-01-01</Variable>
<Variable Name="MiddleDate" DataType="String">2017-01-01</Variable>
</Variables>
<Tasks>
<Dataflow Name="DFT Demo">
<Transformations>
<OleDbSource Name="SRC Query" ConnectionName="tempdb">
<DirectInput><![CDATA[SELECT *
FROM dbo.so_42623962 AS X
WHERE X.[Date] > ? AND X.[Date] <= ? ;]]></DirectInput>
<Parameters>
<Parameter Name="0" VariableName="User.StartDate" />
<Parameter Name="1" VariableName="User.MiddleDate" />
</Parameters>
</OleDbSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
那么,我的工作演示和你的工作演示之间还剩下什么?更容易处理的是日期的价值(开始/中间日期)。我使用的yyyy-mm-dd又称ccyy-mm-dd,我使用的系统更容易理解,但您可以尝试yyyyymmdd的ISO标准
更难处理的是,您的连接管理器被命名为AS400。事实上,这听起来很奇怪,因为我不得不在他们使用的另一个问题上处理一个“奇怪”的日期,但我看到AS400使用了一种类似于“奇怪”的格式,您必须使用派生列编写自己的表达式,以将yyyy-mm-dd日期转换为CYMD。这应该不难,但考虑到可能的日期格式的丰富性,我不会冒险猜测。将数据类型添加到Biml是否有帮助<代码>嗨@sorrell,谢谢你的评论。数据类型属性在这种情况下无效:
Varigence.Languages.Biml.Task.AstVariableParameterMappingNode
。唯一可以接受的属性是VariableName
和Name
变量中的datetime(抱歉,我忘了提到它是datetime,但我认为它变化不大)格式正确:yyyy-mm-dd hh:mm:ss
。我很确定这种格式没有问题,因为我尝试创建一个变量作为表达式,将日期连接为:“SELECT*FROM table WHERE col'+@[User::StartDate]+'”
,它可以工作。有一件事我忘了提,可能很重要的是,源dbms是一个db2
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection Name="tempdb" ConnectionString="Data Source=localhost\dev2016;Initial Catalog=tempdb;Provider=SQLNCLI11.0;Integrated Security=SSPI;"/>
</Connections>
<Packages>
<Package Name="so_42623962" >
<Variables>
<Variable Name="StartDate" DataType="String">2017-01-01</Variable>
<Variable Name="MiddleDate" DataType="String">2017-01-01</Variable>
</Variables>
<Tasks>
<Dataflow Name="DFT Demo">
<Transformations>
<OleDbSource Name="SRC Query" ConnectionName="tempdb">
<DirectInput><![CDATA[SELECT *
FROM dbo.so_42623962 AS X
WHERE X.[Date] > ? AND X.[Date] <= ? ;]]></DirectInput>
<Parameters>
<Parameter Name="0" VariableName="User.StartDate" />
<Parameter Name="1" VariableName="User.MiddleDate" />
</Parameters>
</OleDbSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
<Dataflow Name="DFT Escaped">
<Transformations>
<OleDbSource Name="SRC Query" ConnectionName="tempdb">
<DirectInput>SELECT *
FROM dbo.so_42623962 AS X
WHERE X.[Date] > ? AND X.[Date] <= ?;</DirectInput>
<Parameters>
<Parameter Name="0" VariableName="User.StartDate" />
<Parameter Name="1" VariableName="User.MiddleDate" />
</Parameters>
</OleDbSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>
<Dataflow Name="DFT Escapedx2">
<Transformations>
<OleDbSource Name="SRC Query" ConnectionName="tempdb">
<DirectInput>SELECT *
FROM dbo.so_42623962 AS X
WHERE X.Date > ? AND X.Date <= ?;</DirectInput>
<Parameters>
<Parameter Name="0" VariableName="User.StartDate" />
<Parameter Name="1" VariableName="User.MiddleDate" />
</Parameters>
</OleDbSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>