2017-03-06 22 views
6

Buduję wiele pakietów SSIS z BIML i muszę pobrać dane ze źródła OLE DB między przedziałem dat. Oto XML, który ma generować pakiety:BIML Sparametryzowana kwerenda na źródle Ole db

<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> 

Ta struktura normalnie pracować, bo ja już próbowałem, ale z identyfikatorami (int) zamiast dat (string). Błąd, że jestem odbierania podczas próby wygenerowania pakietu jest następujący:

Could not execute Query on Connection AS400 
OleDbCommand.Prepare method requires all variable length parameters to have an explicitly set non-zero Size. 

wiem, że mogę utworzyć zmienną SSIS i złączyć daty w zapytaniu jako wyrazu, ale chciałbym się trzymać z <DirectInput> zamiast <VariableInput>

Dodatkowe informacje

DateTime (przepraszam zapomniałem wspomnieć, że był datetime, ale nie sądzę, że dużo) zmienia format zmiennej jest poprawny: rrrr-mm- dd hh: mm: ss. Jestem prawie pewien, że nie ma nic złego w tym formacie, ponieważ próbowałem utworzyć zmienną jako wyrażenie, łącząc daty takie jak ta: <Variable Name="Query" DataType="String" EvaluateAsExpression="true">&quot;SELECT * FROM table WHERE col &gt; '&quot; + @[User::StartDate] + &quot;'&quot;</Variable> i to działa. Jedną z rzeczy, zapomniałem wspomnieć, i to może być ważne jest to, że DBMS źródłem jest DB2

+3

Czy dodaje typ danych do pomocy Biml? '' – sorrell

+0

Witam @ clrell, dziękuję za komentarz. Atrybut DataType jest nieprawidłowy w tym przypadku: 'Varigence.Languages.Biml.Task.AstVariableParameterMappingNode'. Jedynymi akceptowanymi atrybutami są 'VariableName' i' Name' http://www.bimlscript.com/Content/Docs/biml.xsd –

Odpowiedz

3

Biorąc pod uwagę definicję Poniższa tabela

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

To był mój minimum, opłacalne Biml który używa parametrów z OLE DB Źródła

<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> 

To wystarczy, aby skompletować pakiet. Gdybym wyjąć CDATA, która wymaga włożenia ucieczce większa niż/mniej niż znaków, to nadal działa

 <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> 

Jeśli nie będę owijać kolumnę Date z szelkami, to nadal działa

 <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> 

Co pozostało między moją pracującą Demo a twoją? Prostszym rozwiązaniem jest wartość twoich dat (data początkowa/środkowa). Użyłem yyyy-mm-dd aka ccyy-mm-dd, który jest bardziej powszechnie rozumiany przez systemy, z którymi pracuję, ale możesz wypróbować standard ISO rrrrmmdd.

Najtrudniejszym elementem do pracy będzie fakt, że menedżer połączeń otrzymał nazwę AS400. W rzeczywistości to dzwoni, bo musiałem uporać się z "dziwną" datą na innym pytaniu, którego używali Julian dates, ale widzę, że AS400 używa formatu CYMD, który jest podobnie "dziwny" i musiałbyś napisać własny wyraz z Wyprowadzona kolumna do przekształcenia daty rrrr-mm-dd na CYMD. Nie powinno to być trudne, ale nie zaryzykuję zgadywania, biorąc pod uwagę bogactwo możliwych formatów daty.

+0

_datetime_ (przepraszam, zapomniałem wspomnieć, że był datetime, ale ja nie myślę, że to się zmienia) format w zmiennej jest poprawny: rrrr-mm-dd gg: mm: ss'.Jestem prawie pewien, że nie ma nic złego w tym formacie, ponieważ próbowałem utworzyć zmienną jako wyrażenie, łącząc daty w następujący sposób: ' " WYBIERZ * Z tabeli WHERE col > '" + @ [User :: StartDate] + "' " 'i to działa. Jedną z rzeczy, o której zapomniałem wspomnieć, a może być ważne, że źródłowa dbms to db2 –

Powiązane problemy