首页 文章

BIML Ole db源的参数化查询

提问于
浏览
5

我正在使用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(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">&quot;SELECT * FROM table WHERE col &gt; '&quot; + @[User::StartDate] + &quot;'&quot;</Variable> 并且它有效 . 一件事我忘了提及,可能重要的是源dbms是db2

1 回答

  • 3

    给出以下表定义

    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 aka ccyy-mm-dd往往被我使用的系统更普遍地理解,但你可能会尝试yyyymmdd的ISO标准 .

    更难处理的事情是你的连接管理器被命名为AS400 . 事实上,因为我不得不在他们使用Julian dates的另一个问题上处理一个"weird"日期,但是我看到AS400使用了CYMD格式,这类似于"odd"并且你很难,但我不会冒险猜测丰富的可能日期格式 .

相关问题