SQL Server Timestamp转Bigint与SSIS中DT_BYTES转DT_I8转换问题求助
解决SSIS中DT_BYTES类型timestamp转DT_I8的问题
我之前也碰到过一模一样的场景!SQL Server的timestamp(现在官方更推荐叫rowversion)本质是8字节的二进制值,要在SSIS数据流里把它从DT_BYTES转成DT_I8(对应SQL的BIGINT),有两种实用的方法,给你拆解清楚:
方法一:在源查询直接转换(最省心)
不用在数据流里折腾数据转换组件,直接在SSIS的源查询里把timestamp列转成BIGINT,这样SSIS读取的时候直接就是DT_I8类型,一步到位。
示例查询:
SELECT [其他字段], CAST([SourceColumn1Timestamp] AS BIGINT) AS SourceColumn1Timestamp_Int FROM 你的源表
这样处理后,数据流里的列直接就是整数类型,完全避开转换组件的潜在问题。
方法二:用SSIS数据转换组件转换
如果一定要在数据流里做转换,注意以下步骤和坑点:
- 拖入数据转换组件,连接数据源输出到该组件
- 打开转换组件编辑器,在「可用输入列」里勾选
SourceColumn1Timestamp - 在「输出别名」里给转换后的列起个名字(比如
SourceColumn1Timestamp_I8) - 「数据类型」选择
DT_I8,然后切换到「高级」选项卡:- 设置「数据溢出处理」:如果你的
timestamp值可能超过BIGINT的最大值(9223372036854775807),可以选择「替换为NULL」或者「失败组件」,根据业务需求来
- 设置「数据溢出处理」:如果你的
- 点击确定后,把转换组件的输出接到目标组件即可
关键注意事项
timestamp是无符号的8字节值,而DT_I8是有符号的,所以当timestamp值大于9223372036854775807时,转换会溢出,一定要提前确认数据范围- SQL Server的
timestamp是自动生成的,转换后的值只是用来读取比较,不要尝试把转换后的整数写回原表的timestamp列,会触发错误 - SSIS的
DT_BYTES转DT_I8默认是小端字节序,和SQL Server的timestamp存储方式一致,不需要额外调整字节顺序
内容的提问来源于stack exchange,提问作者Emil Vissing
相关产品推荐
相关产品推荐

