4

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

问题是如果我以平面文件格式定义大小为-1的AnsiString类型的列,则输出 SSIS 包会显示以下警告

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

如果我单击“是”,问题会自行解决,但这是我最后的选择,因为我有 150 个包裹。

当我检查平面文件源组件的高级选项时,我可以看到注释列的数据类型有所不同,外部列显示为 DT_TEXT,而输出列显示为 DT_STR。:(

我不明白的是,为什么当所有其他列都工作正常时,输出列只为 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>

在此处查看外部列和输出列之间的区别

4

2 回答 2

4

在数据流中,DT_STR 的长度介于 0 到 8000 之间。平面文件连接管理器很乐意让您指定大于 8k 的长度。

在此处输入图像描述

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

在此处输入图像描述

如果您了解 SSIS 如何从数据流中获取性能的概念,那么这很有意义。它预先分配内存并在该内存空间中进行所有转换。您将为 MAX 类型分配多少内存?确切地...

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

比姆

我实际上对此感到困惑,希望 Scott 能加入。发出的 DTSX 将看起来像之前的屏幕截图,数据类型为 DT_STR,长度为零。它运行良好,只是看起来很糟糕。当您双击让编辑器修复它时,它会更改为应有的 DT_TEXT。

在此处输入图像描述

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

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

                        <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 但我仍然收到警告。

在此处输入图像描述

深入了解 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

于 2016-02-16T18:40:58.327 回答
0

我没有尝试,但在 Varigance 文档中找到了它:

<!-- A Length of -1 will automatically be converted to nvarchar(max)/varchar(max) -->
<Column Name="LongString" DataType="String" Length="-1" />
于 2019-11-13T13:23:55.000 回答