BIML назначает неверные метаданные столбцам NUMBER из Oracle

Я успешно создал сценарий BIML на BIDS 2008 с помощью BIDS Helper 1.6.6.0, который автоматизирует создание пакетов служб SSIS для импорта данных из базы данных Oracle (11g Enterprise Edition Release 11.2.0.3.0 - 64bit) в SQL Server 2008 R2. У меня возникла проблема во время выполнения пакета, которая вызывает сбой пакета при проверке потока данных с:

Предупреждение. Внешние столбцы для компонента "Источник" (1) не синхронизированы со столбцами источника данных. Внешний столбец "LIMIT_AMOUNT" необходимо обновить. Внешний столбец "LIMIT_BASE_AMOUNT" необходимо обновить. Внешний столбец "GROSS_BASE_AMOUNT" необходимо обновить.

Ошибка: поставщик OLE DB, используемый адаптером OLE DB, не может выполнить преобразование между типами "DT_BYTES" и "DT_NUMERIC" для "LIMIT_AMOUNT".

Ошибка: поставщик OLE DB, используемый адаптером OLE DB, не может выполнить преобразование между типами "DT_BYTES" и "DT_NUMERIC" для "LIMIT_BASE_AMOUNT".

Ошибка: поставщик OLE DB, используемый адаптером OLE DB, не может выполнить преобразование между типами "DT_BYTES" и "DT_NUMERIC" для "GROSS_BASE_AMOUNT".

Ошибка: были ошибки во время проверки задачи.

После проверки выясняется, что метаданные для NUMBER столбцы без масштаба и точности в Oracle отображаются на DT_BYTES в сгенерированном SSIS. Описание вышеупомянутого объекта (представление) в Oracle выглядит следующим образом:

Name                  Null Type         
--------------------- ---- ------------ 
ID                         NUMBER(12)
CURRENCY                   VARCHAR2(3)  
LIMIT_AMOUNT               NUMBER       
LIMIT_BASE_AMOUNT          NUMBER       
GROSS_BASE_AMOUNT          NUMBER       
STATUS                     VARCHAR2(15) 

Регистрация в all_tab_columns показывает три NUMBER столбцы как имеющие DATA_LENGTH 22 и NULL DATA_PRECISION а также DATA_SCALE,

 COLUMN_ID COLUMN_NAME            DATA_TYPE     DATA_LENGTH DATA_PRECISION DATA_SCALE
---------- ---------------------- ------------- ----------- -------------- ----------
         1 ID                     NUMBER                 22             12          0 
         2 CURRENCY               VARCHAR2                3                           
         3 LIMIT_AMOUNT           NUMBER                 22                           
         4 LIMIT_BASE_AMOUNT      NUMBER                 22                           
         5 GROSS_BASE_AMOUNT      NUMBER                 22                           
         6 STATUS                 VARCHAR2               15                           

Документация Oracle гласит, что это эквивалент float

Укажите число с плавающей точкой, используя следующую форму:

NUMBER

Отсутствие указателей точности и масштаба определяет максимальный диапазон и точность для числа Oracle.

Обходной путь до сих пор заключался в реализации пользовательского SELECT, который приводит эти поля к желаемому типу, но это не очень элегантно или не поддерживается. Я хотел бы понять, почему BIML, по-видимому, неправильно отображает тип данных, в то время как SSIS может определить, что метаданные неверны при первом открытии пакета после его создания - в BIDS появляется всплывающее окно, в котором говорится, что

Метаданные следующих выходных столбцов не соответствуют метаданным внешних столбцов, с которыми связаны выходные столбцы:

Вывод "Вывод": "LIMIT_AMOUNT", "LIMIT_BASE_AMOUNT", "GROSS_EXP_BASE_AMOUNT"

Хотите ли вы заменить метаданные выходных столбцов метаданными внешних столбцов?

РЕДАКТИРОВАТЬ: Добавление соответствующих деталей Biml относительно соединений и потока данных

<#
string OraConnectionStr = @"Provider=OraOLEDB.Oracle;Data Source=(In-line TNS);User Id=redacted;Password=redacted;Persist Security Info=True;";
string StagingConnectionStr = "Data Source=SVR;Initial Catalog=DB;Integrated Security=SSPI;Provider=SQLNCLI10;";
#>

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <Connection Name="<#=StagingConnectionName#>" 
                    ConnectionString="<#=StagingConnectionStr#>" />
        <Connection Name="<#=OraConnectionName#>" 
                    ConnectionString="<#=OraConnectionStr#>" />
    </Connections>
    <Packages>
    <!-- Assume object stagingTables is populated and methods have been defined -->
    <# foreach (DataRow row in stagingTables.Rows) { #>
        <Package Name="<#= GetChildPackageName(row) #>"
                 ConstraintMode="Linear" AutoCreateConfigurationsType="None">
          <Dataflow Name="<#=GetStagingTableDescriptiveName(row)#>" >
            <Tasks>
              <Transformations>
                <OleDbSource Name="Source - <#=GetStagingTableDescriptiveName(row)#>"
                             ConnectionName="<#=OraConnectionName#>" 
                             AlwaysUseDefaultCodePage="true"
                             DefaultCodePage="1252">
                  <DirectInput>SELECT * FROM <#GetOracleObjectName(row)#></DirectInput>
                </OleDbSource>
                <OleDbDestination Name="Destination - <#=GetStagingTableDescriptiveName(row)#>" 
                                  ConnectionName="<#=DataLoadConnectionName#>">
                    <ExternalTableOutput Table="<#= GetStagingTableObjectName(row) #>" />
                </OleDbDestination>
              </Transformations>
            </Dataflow>
          </Tasks>
        </Package>
      <# } #>
    </Packages
</Biml>

Заранее спасибо.

0 ответов

Другие вопросы по тегам