使用 BIML 生成的平面文件连接中的固定宽度二进制列将输出列宽度设为 0(零)

Posted

技术标签:

【中文标题】使用 BIML 生成的平面文件连接中的固定宽度二进制列将输出列宽度设为 0(零)【英文标题】:FixedWidth binary columns in FlatFile Connection generated with BIML gets OutputColumnWidth at 0 (zero) 【发布时间】:2021-07-22 21:08:20 【问题描述】:

当我预览我的 BIML 时,我的列是这样定义的:

    <FlatFileFormat Name="(FFF) MyFixedWidthFlatFile" CodePage="1252" FlatFileType="FixedWidth" RowDelimiter="" IsUnicode="false" TextQualifier="_x003C_none_x003E_">
  <Columns>
    <Column Name="HEADER" DataType="Binary" Length="2" Delimiter="" TextQualified="false" ColumnType="FixedWidth" MaximumWidth="2"></Column>
    <Column Name="DESCRIPT" DataType="AnsiString" Length="30" Delimiter="" TextQualified="false" ColumnType="FixedWidth" MaximumWidth="30"></Column>

包生成成功,但是Flat File Connection中的OutputColumnWidth没有设置二进制列。

字符串列是正确的。

我错过了什么?

谢谢!

【问题讨论】:

有效吗?我看到输入列宽从您的定义中选择了 2。奇怪的是,如果我将其用作平面文件输入,则包将默认(?)元数据中的长度为 255。我今天上班时会保持标签打开,看看是否有什么突然出现在我身上,但我的复制在连接管理器上显示相同 有效吗?它确实生成了我的包。但 Vsual Studio 警告我加载它时出错。就像我说的,在平面文件连接管理器中,二进制列的 OutputColumnWidth 为零,如果我打开平面文件源,我会收到警告,让我用外部列中的元数据替换输出列中的元数据, 如果我这样做,我的平面文件源中的二进制列默认为 255。我总是可以一个一个地编辑每个包来纠正这个问题,但这违背了 BIML 的目的。 MaximumWidth 属性没有在二进制列的包中创建,所以我想我将不得不编写一些代码来解析 DTSX 并以这种方式添加它。很遗憾 BIML 跳过了它。 :( 无论如何,感谢您的宝贵时间!非常感谢您的帮助! 可能值得发一封电子邮件来支持 varigence.com 或在他们的 github 上提出问题 github.com/varigence/BimlPit/issues 我在他们的 GitHub 上创建了一个问题:github.com/varigence/BimlPit/issues/156 【参考方案1】:

所以我做了一件事。 以下代码编辑 DTSX 文件以添加缺少的属性。 注意:如果您打算重用此代码,它将在保存时更改您的包,而不是在包生成时。如果您对此不满意,请将其包装在 EXE 中。此外,它可能会破坏您的包,因此请确保您可以再次生成它或者您有备份。 包和BIML文件应该在同一目录下。

<#@ template tier="999" language="VB" optionexplicit="False" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.IO" #>
<#
Dim filename as string = "package.dtsx"
Dim packageFile As New XmlDocument()
packageFile.Load(Path.GetDirectoryName(Host.templateFile) & "\" & filename)
Dim nodes as XmlNodeList = packageFile.GetElementsByTagName("DTS:FlatFileColumn")
If nodes IsNot Nothing Then
    For each node in nodes
        If node.Attributes("DTS:DataType").Value = "128"Then
            If node.Attributes("DTS:MaximumWidth") Is Nothing Then
                Dim mw as XmlAttribute = packageFile.CreateAttribute("MaximumWidth","www.microsoft.com/SqlServer/Dts")
                mw.Value = node.Attributes("DTS:ColumnWidth").Value
                node.Attributes.InsertAfter(mw,node.Attributes("DTS:ColumnWidth"))
                #>
                <<#="Node " & node.Attributes("DTS:ObjectName").Value & " has changed."#>/>
                <#
            End If
        End If
    Next
End If
packageFile.Save(Path.GetDirectoryName(Host.templateFile) & "\" & filename)
#>
</Biml>

【讨论】:

以上是关于使用 BIML 生成的平面文件连接中的固定宽度二进制列将输出列宽度设为 0(零)的主要内容,如果未能解决你的问题,请参考以下文章

用BIML脚本中的csv文件替换所有双引号

从固定宽度的平面文件获取数百万条记录到 SQL 2000

在平面文件连接器上设置行分隔符属性

生成纯(或平面)二进制文件

BIML 创建错误的元数据

如何使用 SQL 表作为源填充 BIML 中的数组