2014-10-06 2 views
2
<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
<Packages> 
    <Package Name="Extraction_RecordCount" ConstraintMode="Parallel"> 
     <Tasks> 
      <ExecuteSQL Name="Extraction_RecordCount" ConnectionName="Target"> 
       <DirectInput> <![CDATA[ Truncate table CMC.Extraction_RecordCount ]]> </DirectInput> 
      </ExecuteSQL> 
      <Dataflow Name="Fill Extraction_RecordCount"> 
       <PrecedenceConstraints> 
        <Inputs> 
         <Input OutputPathName="Extraction_RecordCount.Output" /> 
        </Inputs> 
       </PrecedenceConstraints> 
       <Transformations> 
        <OleDbSource Name="ExtractedTables" ConnectionName="Target" > 
         <DirectInput> 
          <![CDATA[ 
          SELECT cast(sysobjects.NAME as nvarchar(128)) as TableName 
           ,sysindexes.Rows as #Rows 
          FROM sysobjects 
          INNER JOIN sysindexes ON sysobjects.id = sysindexes.id 
          INNER JOIN (SELECT c.table_name ,c.table_schema FROM information_schema.columns c GROUP BY c.table_name ,c.table_schema) c ON c.table_name = sysobjects.NAME 
          WHERE type = 'U' 
           AND sysindexes.IndId < 2 
           AND c.table_schema = 'EXT' 
          ORDER BY TableName, #Rows 
          ]]> 
         </DirectInput> 
        </OleDbSource> 
        <OleDbSource Name="BackOffice" ConnectionName="Source" > 
         <DirectInput> <![CDATA[ select TABLE_NAME , cast(NUM_ROWS as int) as NUM_ROWS from ALL_ALL_TABLES ORDER BY TABLE_NAME, NUM_ROWS]]> </DirectInput> 
        </OleDbSource> 
        <MergeJoin Name="Join Extracted Tables w BACKOFFICE" JoinType="InnerJoin"> 
         <LeftInputPath OutputPathName="ExtractedTables.Output"> 
          <Columns> 
           <Column SourceColumn="TableName" SortKeyPosition="1"/> 
           <Column SourceColumn="#Rows" SortKeyPosition="2"/> 
          </Columns> 
         </LeftInputPath> 
         <RightInputPath OutputPathName="BackOffice.Output"> 
          <Columns> 
           <Column SourceColumn="TABLE_NAME" SortKeyPosition="1"/> 
           <Column SourceColumn="NUM_ROWS" SortKeyPosition="2" /> 
          </Columns> 
         </RightInputPath> 
         <JoinKeys> 
          <JoinKey LeftColumn="TableName" RightColumn="TABLE_NAME" /> 
         </JoinKeys> 
        </MergeJoin> 
        <OleDbDestination Name="Extraction_RecordCount" ConnectionName="Target"> 
         <ExternalTableOutput Table="CMC.Extraction_RecordCount"/> 
        </OleDbDestination> 
       </Transformations> 
      </Dataflow> 
     </Tasks> 
    </Package> 
</Packages> 

Как получить входные компоненты для объединения слияния, которые будут отсортированы в SSIS при использовании biml?

Этот код делает генерировать пакет «Extraction_RecordCount'but ошибка брошенная» Merge Присоединяйтесь «-компонентного о том, что Imput из обоих источников должны быть отсортированы. Ручная установка «IsSorted» = «True» и установка «SortKeyPosition» решает проблему временно.

Вставка компонентов Sort также не будет работать.

+0

Http: //dba.stackexchang e.com/questions/77666/ssis-get-max-value-in-column-and-create-new-column Пока я читаю ваш точный вопрос, вы можете вырезать из моего ответа на DBA.SE – billinkc

ответ

0

Требование к объединению присоединений заключается в том, что ваши источники отсортированы. То, что указывает ваш текущий код, заключается в том, что результат преобразования Merge Join сортируется. Вместо этого вы хотите указать, что вход для объединения объединения сортируется.

Ваши исходные данные отсортированы, я вижу, что у них есть явные ORDER BY операции в них. То, что вам не хватает, - это спецификация, которую сортирует исходный компонент.

   <OleDbSource Name="ExtractedTables" ConnectionName="Target" > 
        <DirectInput> 
         <![CDATA[ 
         SELECT cast(sysobjects.NAME as nvarchar(128)) as TableName 
          ,sysindexes.Rows as #Rows 
         FROM sysobjects 
         INNER JOIN sysindexes ON sysobjects.id = sysindexes.id 
         INNER JOIN (SELECT c.table_name ,c.table_schema FROM information_schema.columns c GROUP BY c.table_name ,c.table_schema) c ON c.table_name = sysobjects.NAME 
         WHERE type = 'U' 
          AND sysindexes.IndId < 2 
          AND c.table_schema = 'EXT' 
         ORDER BY TableName, #Rows 
         ]]> 
        </DirectInput> 
        <Columns> 
         <Column SourceColumn="TableName" SortKeyPosition="1"></Column> 
         <Column SourceColumn="#Rows" SortKeyPosition="2"></Column> 
        </Columns> 
       </OleDbSource> 
       <OleDbSource Name="BackOffice" ConnectionName="Source" > 
        <DirectInput> <![CDATA[ select TABLE_NAME , cast(NUM_ROWS as int) as NUM_ROWS from ALL_ALL_TABLES ORDER BY TABLE_NAME, NUM_ROWS]]> </DirectInput> 
         <Columns> 
          <Column SourceColumn="TABLE_NAME" SortKeyPosition="1"></Column> 
          <Column SourceColumn="NUM_ROWS" SortKeyPosition="2"></Column> 
         </Columns> 
       </OleDbSource> 

Я не 100%, что фактическое имя #Rows в первом запросе будет действительным, но главное, чтобы пометить его как сортируется по имени столбца

Там в полный конец -в-конец Merge Присоединяйтесь пример более на мой ответ на этот вопрос DBA.StackExchange.com