)" ConnectionName="AS-6ren">
gpt4 book ai didi

ssis - Ole db 源上的 BIML 参数化查询

转载 作者:行者123 更新时间:2023-12-04 20:06:57 25 4
gpt4 key购买 nike

我正在使用 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 &gt; ? AND s.date &lt;= ?
</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(整数)而不是日期(字符串)。我在尝试生成包时收到的错误如下:
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>
附加信息

变量中的日期时间(对不起,我忘了提到它是日期时间,但我认为它变化不大)格式是正确的:yyyy-mm-dd hh:mm:ss。我很确定格式没有问题,因为我试图创建一个变量作为表达式,像这样连接日期: <Variable Name="Query" DataType="String" EvaluateAsExpression="true">&quot;SELECT * FROM table WHERE col &gt; '&quot; + @[User::StartDate] + &quot;'&quot;</Variable>它有效。我忘记提及的一件事可能很重要是源 dbms 是 db2

最佳答案

鉴于下表定义

CREATE TABLE dbo.so_42623962
(
RowSk int NOT NULL
, [Date] date
);

这是我使用 OLE DB Sources 参数的最小的、可行的 Biml
<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>

这样就可以很好地构建一个包。如果我取出 CDATA,它需要转义大于/小于字符,它仍然有效
        <Dataflow Name="DFT Escaped">
<Transformations>
<OleDbSource Name="SRC Query" ConnectionName="tempdb">
<DirectInput>SELECT *
FROM dbo.so_42623962 AS X
WHERE X.[Date] &gt; ? AND X.[Date] &lt;= ?;</DirectInput>
<Parameters>
<Parameter Name="0" VariableName="User.StartDate" />
<Parameter Name="1" VariableName="User.MiddleDate" />
</Parameters>
</OleDbSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>

如果我不包装 Date带大括号的列,它仍然有效
        <Dataflow Name="DFT Escapedx2">
<Transformations>
<OleDbSource Name="SRC Query" ConnectionName="tempdb">
<DirectInput>SELECT *
FROM dbo.so_42623962 AS X
WHERE X.Date &gt; ? AND X.Date &lt;= ?;</DirectInput>
<Parameters>
<Parameter Name="0" VariableName="User.StartDate" />
<Parameter Name="1" VariableName="User.MiddleDate" />
</Parameters>
</OleDbSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>

那么我的工作演示和你的演示之间还剩下什么?更容易解决的是日期的值(value)(开始/中间日期)。我使用 yyyy-mm-dd 又名 ccyy-mm-dd 往往被我使用的系统更普遍地理解,但您可以尝试 yyyymmdd 的 ISO 标准。

更难处理的部分是您的连接管理器被命名为 AS400。事实上,这敲响了警钟,因为我不得不处理他们使用的另一个问题的“奇怪”日期 Julian dates但我看到 AS400 使用 CYMD格式类似“奇数”,您必须使用派生列编写自己的表达式才能将 yyyy-mm-dd 日期转换为 CYMD。应该不难,但鉴于可能的日期格式的丰富性,我不会冒险猜测。

关于ssis - Ole db 源上的 BIML 参数化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com