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>
Заранее спасибо.