首页 文章

带VARCHAR(MAX)列的BIML平面文件格式

提问于
浏览
3

到目前为止,我已成功使用BIML自动生成SSIS包(从CSV到SQL Server) . 但是我遇到了平面文件格式中包含Varchar(MAX)列的问题 .

问题是如果我在Flat文件格式中定义类型为 AnsiString 且列号为 -1 的列,则输出SSIS包显示以下警告

以下输出列的元数据与输出列关联的外部列的元数据不匹配 .

如果我单击是,问题本身就已解决,但这将是我的最后一个选项,因为我有150个包 .

当我检查平面文件源组件的高级选项时,我可以看到列 Comments 的数据类型不同,外部列显示为DT_TEXT,其中输出列显示DT_STR . :(

我不明白的是,当所有其他工作正常时,Output列仅显示Varchar(Max)的不同数据类型 . 外部列是否生成输出列?

请参阅下面的biml代码 .

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
 <FileFormats>
        <FlatFileFormat Name="MetadataFileFormat" RowDelimiter="LF" ColumnNamesInFirstDataRow="true" IsUnicode="false">
            <Columns>
                <Column Name="Category" DataType="AnsiString" Length="128" Delimiter="|" CodePage="1252" />
                <Column Name="Comments" DataType="AnsiString" Length="-1" Delimiter="|" />
                <Column Name="DisplayName" DataType="AnsiString" Length="256" Delimiter="CRLF" />
            </Columns>
        </FlatFileFormat>
    </FileFormats>
	
	<Connections>
		<FlatFileConnection Name="FF_Test" FilePath="C:\Data\Sample.csv" FileFormat="MetadataFileFormat">
		</FlatFileConnection>
	</Connections>
	
	<Packages>
		<Package Name="FFTest" ConstraintMode="Linear">
			<Tasks>
				<Dataflow  Name="DFT Load Data">
					<Transformations>
						<FlatFileSource Name="FF_SRC" ConnectionName="FF_Test">
						</FlatFileSource>
					</Transformations>
				</Dataflow>
			</Tasks>
		</Package> 
	</Packages>
</Biml>

See the difference between External and Output columns here

1 回答

  • 4

    在数据流中,DT_STR的长度介于0到8000之间 . 平面文件连接管理器很高兴您可以指定大于8k的长度 .

    enter image description here

    但是,当您尝试在数据流中使用它时,组件将报告它不是有效长度

    enter image description here

    如果您了解SSIS如何从数据流中获得性能,那么这是有意义的 . 它预先分配内存并完成该内存空间中的所有转换 . 你会为MAX类型分配多少内存?究竟...

    因此,您将需要使用其中一种流数据类型:DT_TEXT或DT_NTEXT . 那些允许无限长度的字符串 .

    Biml

    我实际上对此感到难过,希望Scott可以插入 . 发出的DTSX将看起来像前截图,数据类型为DT_STR,长度为零 . 它运行良好,看起来很糟糕 . 当您双击以让编辑器修复它时,它会更改为DT_TEXT .

    enter image description here

    我认为这只是在执行SQL任务中提供数据类型覆盖的问题,但无济于事,它不是平面文件源中Columns集合的属性 .

    也许这是我需要弄乱Dataflow覆盖属性的情况......

    <DataflowOverrides>
                                <OutputPath OutputPathName="Output">
                                    <Columns>
                                        <Column 
                                            ColumnName="Comments" 
                                            DataType="AnsiString" 
                                            CodePage="1252"
                                            Length="-1" 
                                            ></Column>
                                    </Columns>
                                </OutputPath>
                            </DataflowOverrides>
    

    但不,这没有给我带来更好的结果 .

    好吧,我放弃了“欺骗”,使用Mist / BimlOnline将纠正后的包重新设计回Biml .

    <Biml xmlns="http://schemas.varigence.com/biml.xsd">
      <Connections>
        <FlatFileConnection Name="FF_Test" FilePath="C:\ssisdata\SO\Input\so_35438946.txt" FileFormat="FF_Test" />
      </Connections>
      <Packages>
        <Package Name="so_35438946_re" Language="None" VersionBuild="1" CreatorName="BillFellows" CreatorComputerName="AVATHAR" CreationDate="2016-02-16T13:02:49">
          <Tasks>
            <Dataflow Name="DFT Load Data">
              <Transformations>
                <DerivedColumns Name="DER Placeholder">
                  <InputPath OutputPathName="FF_SRC.Output" />
                </DerivedColumns>
                <FlatFileSource Name="FF_SRC" LocaleId="None" FileNameColumnName="" ConnectionName="FF_Test" />
              </Transformations>
            </Dataflow>
          </Tasks>
          <Connections>
            <Connection ConnectionName="FF_Test" />
          </Connections>
        </Package>
      </Packages>
      <FileFormats>
        <FlatFileFormat Name="FF_Test" CodePage="1252" TextQualifer="_x003C_none_x003E_" ColumnNamesInFirstDataRow="true" RowDelimiter="LF">
          <Columns>
            <Column Name="Category" Length="128" DataType="AnsiString" Delimiter="VerticalBar" MaximumWidth="128" />
            <Column Name="Comments" Length="-1" DataType="AnsiString" Delimiter="VerticalBar" />
            <Column Name="DisplayName" Length="256" DataType="AnsiString" Delimiter="CRLF" MaximumWidth="256" />
          </Columns>
        </FlatFileFormat>
      </FileFormats>
    </Biml>
    

    而现在我只是简单地生成SSIS包......嗯,我认为这是进步 . 评论被标识为DT_TEXT,但我仍然收到警告 .

    enter image description here

    深入了解dtsx

    在数据流的平面文件源中,此列的外部元数据集合定义如下

    <externalMetadataColumn
        codePage="1252"
        dataType="str"
        name="Comments"
        refId="Package\DFT Load Data\FF_SRC.Outputs[Output].ExternalColumns[Comments]"></externalMetadataColumn>
    

    在开头我们让编辑调整

    <externalMetadataColumn
        refId="Package\DFT Load Data\FF_SRC.Outputs[Output].ExternalColumns[Comments]"
        codePage="1252"
        dataType="text"
        name="Comments" />
    

    我们得到了使用原始代码从VS 2013发出的那个

    <externalMetadataColumn 
        codePage="1252" 
        dataType="str" 
        name="Comments" 
        refId="Package\DFT Load Data\FF_SRC.Outputs[Output].ExternalColumns[Comments]">
    </externalMetadataColumn>
    

    它可能是令人反感的,但也许一些XSLT可以找到任何你有这个命名列和数据类型 str 并将其转换为 text 的实例

相关问题