Teradata间隔时间至分钟列导入SQL Server链接服务器异常求助
先给你吃个定心丸:完全不需要重装SQL Server,这个问题是Teradata与SQL Server之间的类型映射逻辑以及驱动处理缺陷导致的,和SQL Server本身的安装状态无关。
问题根源
Teradata的INTERVAL TIME TO MINUTE是专门用于存储时间间隔的专用类型,而SQL Server并没有直接对应的原生类型。当你通过链接服务器的OPENQUERY拉取数据时,负责两个数据库之间数据转换的是Teradata的OLE DB/ODBC驱动,问题就出在这里:
- 驱动错误地将Teradata的
INTERVAL TIME TO MINUTE类型映射到了SQL Server的binary(6)类型,而非更合理的字符类型(如varchar)或数值类型; - 驱动在转换
0:18这个间隔值时,没有按照你预期的字符串二进制编码(0x303A31380000)写入,而是错误填充了全0的二进制值——这大概率是驱动对该类型的转换逻辑存在bug,或者默认规则就忽略了实际间隔值的字符化输出。
解决方案
这里有几个直接可行的修复方法:
1. 在Teradata端显式转换为字符串
最直接的办法是在Teradata的查询里,把INTERVAL TIME TO MINUTE列转换成字符串类型,让SQL Server能正确接收并存储。
修改你的查询语句如下:
select <mycol> into <SQLTable> from openquery(<TERADATADB>, ' SELECT CAST(<mycol> AS VARCHAR(5)) AS <mycol>, -- 显式转成字符串格式 -- 这里列出表中其他需要导入的列 FROM <TDBD>.<TDTable> ') T
导入后<mycol>会变成SQL Server的varchar(5)类型,值为'0:18',如果你需要它的二进制形式,再执行CAST(<mycol> AS binary(6))就能得到你预期的0x303A31380000。
2. 更新Teradata驱动
你当前使用的Teradata驱动版本可能对INTERVAL类型的支持不完善,建议下载并安装适配SQL Server 2014和Windows 10 64位的最新Teradata ODBC/OLE DB驱动。更新驱动后,部分类型映射的问题可能会被官方修复,后续直接拉取数据时就能得到正确的类型和值。
3. 转换为数值类型保留间隔意义
如果你不需要字符串形式,而是想保留时间间隔的数值意义,可以在Teradata端把间隔转换成总分钟数,比如:
select <mycol> into <SQLTable> from openquery(<TERADATADB>, ' SELECT EXTRACT(MINUTE FROM <mycol>) AS <mycol>, -- 提取间隔的总分钟数 -- 其他需要导入的列 FROM <TDBD>.<TDTable> ') T
导入后<mycol>会是INT类型,值为18。之后如果需要还原成时间间隔格式,在SQL Server里可以用CAST(CAST(<mycol> AS VARCHAR) + ':00' AS TIME)或者自定义逻辑转换。
内容的提问来源于stack exchange,提问作者eolan24

