3

当我使用 GetDropAndCreateDdl 为表生成 CREATE 脚本时,我得到的列的数据类型与实际的数据类型不同。

这会导致包验证错误,即“错误输出具有与其相应数据源列的属性不匹配的属性”和“VS_NEEDSNEWMETADATA”的验证状态。

如果我右键单击连接源,选择显示高级编辑器,然后查看列映射,我可以看到可用外部列列表中的 [Column1] 的长度与在 GetDropAndCreateDdl 中生成的数据类型不同。我可以删除并重新创建元数据映射,但这不是一个可行的解决方案,因为有很多数据流任务。

如何让 GetDropAndCreateDdl 创建具有正确长度的正确数据类型?

我正在使用 ImportDB 来获取表、元数据等的列表。

环境.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>

创建表元数据.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>

部署目标表.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 源创建的脚本 -

在此处输入图像描述

以下是同一张表的 INFORMATION_SCHEMA.COLUMNS 的结果 -

在此处输入图像描述

4

1 回答 1

1

您是否尝试过使用较新的方法:GetDatabaseSchema?我发现它在不同的连接类型中更加可靠。

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

于 2016-04-07T12:31:17.843 回答