2016-04-06 3 views
3

Когда я использую GetDropAndCreateDdl для генерации сценариев CREATE для таблиц, я получаю типы данных для столбцов, отличных от того, какими являются фактические типы данных.BIML GetDropAndCreateDdl, создавая неправильные длины для типов данных

Это приводит к ошибке проверки пакета, что «выход ошибки имеет свойства, которые не соответствуют свойствам соответствующего столбца источника данных» и статус проверки «VS_NEEDSNEWMETADATA».

Если я щелкнул правой кнопкой мыши источник подключения, выберите «Показать расширенный редактор» и взгляните на сопоставления столбцов, я вижу, что [Column1] в списке доступных внешних столбцов имеет разную длину, чем тип данных, который был сгенерирован в GetDropAndCreateDdl. Я могу удалить и пересоздать сопоставления метаданных, но это не является жизнеспособным решением, поскольку есть много задач потока данных.

Как получить GetDropAndCreateDdl для создания правильных типов данных с правильной длиной?

Я использую ImportDB, чтобы получить список таблиц, метаданных и т.д.

Environment.biml

<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <Connections> 
     <OdbcConnection Name="OdbcSrc_DV" ConnectionString="Dsn=Source-32bit-test;" /> 
     <OleDbConnection Name="OleDbDst_Staging" ConnectionString="Provider=SQLNCLI11;Server=SQL-DEV;Initial Catalog=Source_Staging;Integrated Security=SSPI;" /> 
    </Connections> 
    <Databases> 
     <Database Name="Source" ConnectionName="OdbcSrc_DV" /> 
     <Database Name="Source_Staging" ConnectionName="OleDbDst_Staging" /> 
    </Databases> 
    <Schemas> 
     <Schema Name="dbo" DatabaseName="Source" /> 
     <Schema Name="dbo" DatabaseName="Source_Staging" /> 
    </Schemas> 
</Biml> 

CreateTableMetadata.biml

<#@ import namespace="System.Data" #> 
<#@ import namespace="Varigence.Biml.CoreLowerer.SchemaManagement" #> 
<# 
var sourceConnection = RootNode.DbConnections["OdbcSrc_DV"]; 
var importResult = sourceConnection.ImportDB("", "", ImportOptions.ExcludeForeignKey | ImportOptions.ExcludeColumnDefault | ImportOptions.ExcludeViews); 

var tableNamesToImport = new List<string>() { "Test_Table" }; 
#> 
<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <Tables> 

    <# foreach (var table in importResult.TableNodes.Where(item => tableNamesToImport.Contains(item.Name)).OrderBy(item => item.Name)) { #> 

    <Table Name="<#=table.Name#>" SchemaName="Source.dbo"> 
     <Columns> 
      <#=table.Columns.GetBiml()#> 
     </Columns> 
     <Annotations> 
     <Annotation AnnotationType="Tag" Tag="SourceSchemaQualifiedName"><#=table.SchemaQualifiedName#></Annotation> 
     </Annotations> 
    </Table> 
    <# } #> 
    </Tables> 
</Biml> 

DeployTargetTables. biml

<#@ template tier="2" #> 
<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <Packages> 
    <Package Name="MasterTableDeploy" ConstraintMode="Parallel"> 
     <Tasks> 
     <# foreach (var table in RootNode.Tables) { #> 

     <ExecuteSQL Name="SQL CREATE <#=table.Name#>" ConnectionName="OleDbDst_Staging"> 
      <DirectInput><#=table.GetDropAndCreateDdl()#></DirectInput> 
     </ExecuteSQL> 
     <# } #> 
     </Tasks> 
    </Package> 
    </Packages> 
</Biml> 

CreateLoadPackages.biml

<#@ template tier="2" #> 
<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <Packages> 
    <Package Name="Copy Data" ConstraintMode="Parallel"> 

     <Tasks> 
     <# foreach (var table in RootNode.Tables) { #> 
     <ExecuteSQL Name="SQL TRUNCATE <#=table.Name#>" ConnectionName="OleDbDst_Staging"> 
      <DirectInput>TRUNCATE TABLE <#=table.Name#></DirectInput> 
     </ExecuteSQL> 
     <Dataflow Name="DFT LOAD <#=table.Schema.Name#>_<#=table.Name#>"> 
      <PrecedenceConstraints> 
       <Inputs> 
        <Input OutputPathName="SQL TRUNCATE <#=table.Name#>.Output" /> 
       </Inputs> 
      </PrecedenceConstraints> 
      <Transformations> 

       <OdbcSource Name="ODBC_SRC <#=table.Name#>" Connection="OdbcSrc_DV"> 
       <DirectInput>SELECT <#=table.GetColumnList()#> FROM <#=table.GetTag("SourceSchemaQualifiedName")#></DirectInput> 
       </OdbcSource> 

      <OleDbDestination Name="ODBC_DST <#=table.Name#>" ConnectionName="OleDbDst_Staging"> 
       <TableOutput TableName="<#=table.ScopedName#>" /> 
      </OleDbDestination> 
      </Transformations> 
     </Dataflow> 
      <# } #> 
     </Tasks> 
    </Package> 
    </Packages> 
</Biml> 

Вот скрипт, который будет создаваться из источника ODBC -

enter image description here

А вот результаты INFORMATION_SCHEMA.COLUMNS для та же самая таблица -

enter image description here

+0

Вы заметили какие-либо конкретные типы данных, которые приводят к неправильному типов и длины в BIML? Получили минимальное воспроизведение для нас? Какую версию SQL Server (я полагаю) вы подключаете? – billinkc

+0

Я только заметил, что типы nvarchar меняются. В приведенном выше примере я ожидаю, что [Столбец 1] будет nvarchar (30), но используя GetDropAndCreateDdl, он переходит как nvarchar (45). Обновлен мой вопрос, чтобы включить сценарии BIML. – Tom

+0

Я [не вижу] (http://i.stack.imgur.com/3BqjN.png) с моей [простейшей версией скрипта] (https://gist.github.com/billinkc/7b42479ba9669e944fb194e2285dcae8) , Мне нужно запустить, но я попытаюсь взглянуть на то, что вы конкретно делаете позже. – billinkc

ответ

1

Вы пробовали использовать новый метод: GetDatabaseSchema? Я нашел, что он намного надежнее в разных типах соединений.

http://www.cathrinewilhelmsen.net/2015/07/12/biml-extension-methods-getdatabaseschema/

+0

Спасибо, попробуем это. Я использую источник ODBC, поэтому мне придется изменить этот пример и посмотреть, работает ли он. Она использует источник OLEDB. – Tom