You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Teradata间隔时间至分钟列导入SQL Server链接服务器异常求助

问题原因与解决方案

先给你吃个定心丸:完全不需要重装SQL Server,这个问题是Teradata与SQL Server之间的类型映射逻辑以及驱动处理缺陷导致的,和SQL Server本身的安装状态无关。

问题根源

Teradata的INTERVAL TIME TO MINUTE是专门用于存储时间间隔的专用类型,而SQL Server并没有直接对应的原生类型。当你通过链接服务器的OPENQUERY拉取数据时,负责两个数据库之间数据转换的是Teradata的OLE DB/ODBC驱动,问题就出在这里:

  1. 驱动错误地将Teradata的INTERVAL TIME TO MINUTE类型映射到了SQL Server的binary(6)类型,而非更合理的字符类型(如varchar)或数值类型;
  2. 驱动在转换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:54:36