平面文件目标列数据类型验证

问题描述 投票:3回答:2

通过OLE DB源读取INT类型的源数据库字段。它最终写入平面文件目的地。目标Flat File Connection Manager> Advanced页面将其报告为four-byte signed integer [DT_I4]

这种数据类型让我认为它表示二进制。显然,它没有。我很惊讶它不是更通用的numeric [DT_NUMERIC]

我将此类型设置更改为single-byte signed integer [DT_I1]。我预计这会失败,但事实并非如此。即使字段的值始终> 127,该过程也会产生相同的结果。为什么这不会失败?

产生的一些值是

1679576722
1588667638
1588667638
1497758544
1306849450
1215930367
1215930367
1023011178
1932102084 

显然,在single-byte signed integer [DT_I1]范围之外。

作为一个相关的问题,是否可以将二进制数据输出到平面文件?如果是这样,应该使用哪些设置和位置?

csv ssis integer flat-file ssis-data-types
2个回答
0
投票

在重新阅读问题以确保它符合我的校对编辑后,我意识到我似乎没有回答你的问题 - 抱歉。我留下了第一个答案,以防有用。

SSIS似乎没有强制执行目标元数据;但是,它会强制执行源元数据。我创建了一个范围为-127到400的测试文件。我使用以下方案测试了这个:

  • 测试1:具有带符号1字节数据类型的源和目标平面文件连接管理器。
  • 结果1:失败
  • 测试2:源是4字节签名,目标是1字节签名。
  • 结果2:通过

SSIS的管道元数据验证仅关注与管道宽度匹配的输入的元数据。它似乎不关心输出是什么。但是,它使您能够将目标设置为下游源的任何内容,以便在目标(即SQL Server)元数据匹配与否匹配时可以检查并提供警告。

这是一个意想不到的结果 - 我预计它会像你一样失败。直觉上,它没有失败的事实仍然有意义。由于我们正在写入CSV文件,因此无法控制所需的元数据。但是,如果我们将其挂钩到SQL Server目标并且元数据不匹配,那么SQL Server将对边界数据不满(请参阅我的其他答案)。

现在,我仍然会设置输出的元数据以匹配管道中的元数据,因为这有区别字符串与数字数据类型的重要考虑因素。因此,如果您尝试将日期时间设置为整数,则不会有文本限定符,这可能会导致下一个输入过程出错。相反,您可能会遇到将一个整数设置为varchar并具有相同问题,这意味着它将获得文本限定符。

我认为目标元数据未被强制执行的事实是SSIS中的一个薄弱环节。但是,可以通过将其设置为与管道缓冲区匹配来否定它,这是自动完成的,假设它是丢弃到设计的最后一个任务。话虽如此,如果您在开发完成后更新管道上的元数据,那么您可以在整个管道中更新元数据,因为某些任务必须打开和关闭,而其他任务必须删除,重新创建以更新元数据。

附加信息

TL DR:TINYINT被存储为在SQL Server一个无符号的数据类型,这意味着它支持0与255之间的值,以便一个值大于127是可以接受的 - 超过会导致错误达到255任何。

字节大小表示可能的组合的最大数量,其中有符号/无符号表示范围是否在正值和负值之间分配。

  • 1个字节= SQL Server中的TinyInt
  • 1字节是8位= 256种组合
  • 签名范围:-128至127
  • 无符号范围:0到255

请务必注意,SQL Server不支持直接签名数据类型。我的意思是没有办法将整数数据类型(即TinyInt,Int和BigInt)设置为有符号或无符号。

  • TinyInt它是未签名的
  • Int和BigInt已签名

请参阅下面的参考:SQL Server自动标识字段的最大大小

如果我们尝试将TinyInt设置为无符号范围之外的任何值(例如,-1或256),那么我们会收到以下错误消息:

TinyInt Error Message

这就是您能够设置大于127的值的原因。

Int错误消息:

Int Error Message

BigInt错误消息:

BigInt Error Message

对于Identity列,如果我们将Identity列声明为Int(即32位〜= 43亿个组合)并将种子设置为0且增量为1,那么SQL Server在停止之前只会转到2,147,483,647行,这是最大签名值。但是,我们缩短了一半的范围。如果我们将种子设置为-2,147,483,648(不要忘记在范围中包含0),那么SQL Server将在停止之前递增整个范围的组合。

参考文献:

SSIS Data Types and Limitations

Max Size of SQL Server Auto-Identity Field


2
投票

Data types validation

我认为这个问题与使用的连接管理器有关,因为数据类型验证(管道外)不是由Integration服务完成的,它由服务提供者完成:

  • OLEDB for Excel和Access
  • SQL Server的SQL数据库引擎
  • ...

说到平面文件连接管理器,它不保证任何数据类型的一致性,因为所有值都存储为文本。例如,尝试添加平面文件连接管理器并选择包含名称的文本文件,尝试将列数据类型更改为日期并转到列预览选项卡,它将显示所有列没有任何问题。它只处理行分隔符,列分隔符,文本限定符和用于从平面文件中读取的公共属性。 (类似于VB.NET中的TextFieldParser类)

数据类型可能导致异常的唯一情况是当您使用Flat文件源时,因为Flat文件源将在Flat文件连接管理器中创建具有已定义元数据的External列,并将它们链接到原始列(您可以看到当您打开平面文件源的高级编辑器时,当SSIS尝试从平面文件源读取时,外部列将抛出异常。

Binary output

您应该将列转换为包中的二进制文件并将其映射到目标列。例如,您可以使用脚本组件来执行此操作:

public override void myInput_ProcessInputRow(myInputBuffer Row)
  {

  Row.ByteValues=System.Text.Encoding.UTF8.GetBytes (Row.name);

  }

我没有尝试,如果这将适用于派生列或数据转换转换。

参考

© www.soinside.com 2019 - 2024. All rights reserved.