在重新阅读问题以确保它与我的校对编辑相匹配后,我意识到我似乎没有回答你的问题 - 对此感到抱歉。我留下了第一个答案,以防万一。
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 错误信息](https://i.stack.imgur.com/CK5AK.png)
这就是您能够设置大于 127 的值的原因。
内部错误信息:
![内部错误信息](https://i.stack.imgur.com/4InRC.png)
BigInt 错误信息:
![BigInt 错误信息](https://i.stack.imgur.com/JJbz5.png)
关于 Identity 列,如果我们将 Identity 列声明为 Int(即 32 位 ~= 43 亿个组合)并将种子设置为 0,增量为 1,那么 SQL Server 在停止之前将只移动到 2,147,483,647 行,这是最大的有符号值。但是,我们少了一半的范围。如果我们将种子设置为 -2,147,483,648(不要忘记在范围内包含 0),那么 SQL Server 将在停止之前递增整个组合范围。
参考:
SSIS 数据类型和限制
SQL Server 自动标识字段的最大大小