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>

このコードはパッケージ 'Extraction_RecordCount' を生成しますが、両方のソースの入力をソートする必要があることを示すエラーが 'Merge Join' コンポーネントによってスローされます。'IsSorted' = 'True' を手動で設定し、'SortKeyPosition' を設定すると、一時的に問題が解決します。

Sort-components の挿入も機能しません。

4

1 に答える 1

0

マージ結合の要件は、ソースが並べ替えられていることです。現在のコードが指定しているのは、Merge Join 変換の出力が並べ替えられることです。代わりに、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>

最初のクエリの実際の名前#Rowsが有効になるとは100%ではありませんが、重要なことは、列名でソートされていることをマークすることです

このDBA.StackExchange.comの質問に対する私の回答には、完全なエンドツーエンドのマージ結合の例があります

于 2014-10-06T19:25:52.477 に答える