ODBC连接MS Access 2016时SQL Server视图Decimal字段显示为短文本问题
问题:SQL Server视图链接到Access后字段类型识别异常
通过ODBC(版本2018.183.0101)将SQL Server视图sgo.cdbArticles作为链接表添加到MS Access 2016时,实际为Decimal(18,4)类型的GainShare字段被识别为短文本;但直接链接该字段所在的源表DataFactory.cdb.ContractItems时,却能正确识别为Decimal(18,4)。记得Access可能通过扫描前1000条记录确定数据类型,但找不到相关依据,求解释原因。
视图SQL语句
ALTER VIEW [sgo].[cdbArticles] AS SELECT [ID], [Contract_nr], <此处省略部分公司特定字段>, GainShare, GainShareRemark FROM DataFactory.cdb.ContractItems GO
相关截图说明
截图显示表设计视图中,
GainShare字段被标记为短文本类型,与源表的Decimal(18,4)类型不符。
原因分析
- Access类型推断机制:Access通过ODBC链接外部数据源时,对于视图这类无明确固定元数据的对象,确实会扫描前1000条样本记录推断字段类型(微软官方文档明确:当ODBC驱动无法返回精确字段类型时,Access依赖样本记录判断)。若视图返回的前1000条记录中
GainShare存在大量NULL值或异常文本数据,就会被误判为短文本;而源表的字段类型是系统固定元数据,ODBC驱动直接传递精确类型,所以识别正确。 - 视图与源表的元数据返回差异:SQL Server对表和视图的元数据返回逻辑不同:源表的字段类型是明确的系统元数据,ODBC驱动直接传递;视图是虚拟表,驱动可能不主动返回精确类型(尤其当视图包含省略元数据的操作时),Access只能靠样本推断。
解决办法
- 强制指定视图字段类型:修改视图,用
CAST/CONVERT明确指定字段类型,确保ODBC驱动返回精确信息:
ALTER VIEW [sgo].[cdbArticles] AS SELECT [ID], [Contract_nr], <此处省略部分公司特定字段>, CAST(GainShare AS DECIMAL(18,4)) AS GainShare, GainShareRemark FROM DataFactory.cdb.ContractItems GO
- 调整Access扫描阈值:修改注册表(32位系统:
HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\ODBC\MaxScanRows;64位系统:HKLM\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\ODBC\MaxScanRows),将值改为0(扫描所有记录),但可能降低加载速度。 - 刷新链接表元数据:在Access中选中链接表,右键打开「链接表管理器」,重新链接并勾选「始终提示新位置」,强制重新获取元数据。
内容的提问来源于stack exchange,提问作者MrSiezen
相关产品推荐
相关产品推荐

