SQL Server 2019外部表连接SAP HANA忽略指定Schema问题排查
我来帮你搞定这个头疼的问题——你遇到的核心问题是SQL Server外部表在生成HANA查询时,没有正确识别你指定的SAPABAP1 schema,反而默认使用了凭据里的rambler schema,导致找不到表。下面分两步分析原因并给出解决方案:
问题根源
你用OpenQuery能正常查询是因为直接把带双引号的限定表名"SAPABAP1"."TCURR"发送给了HANA,驱动能正确解析。但外部表的机制是让SQL Server自动生成查询语句,你的Location参数格式不对,导致SQL Server没有把SAPABAP1 schema包含在生成的查询里,反而用了HANA连接的默认schema(也就是你凭据里的rambler)。
解决方案
方案一:修改连接选项,指定默认Schema
这是最直接的方法,在创建外部数据源时,给HANA ODBC连接添加CURRENTSCHEMA参数,强制连接默认使用SAPABAP1 schema:
-- 先删除已有的外部数据源(如果存在) If Exists (Select 1 From sys.external_data_sources Where name = 'SAPHANA_HNQ') Drop External Data Source SAPHANA_HNQ; Go -- 创建外部数据源时添加CURRENTSCHEMA参数 Create External Data Source SAPHANA_HNQ With ( Location ='ODBC://10.10.10.10:30015', Credential = Me@HANA, Pushdown = On, Connection_Options = 'Driver={HDBODBC};ServerNode=10.10.10.10:30015;CURRENTSCHEMA=SAPABAP1' ); Go -- 创建外部表时,Location只需要写表名TCURR If Object_Id('SAP.TCURR') Is Not Null Drop External Table SAP.TCURR; Go Create External Table SAP.TCURR ( MANDT NVarChar(3) Not Null, KURST NVarChar(4) Not Null, FCURR NVarChar(5) Not Null, TCURR NVarChar(5) Not Null, GDATU NVarChar(8) Not Null, UKURS Numeric(9, 5) Not Null, FFACT Numeric(9, 0) Not Null, TFACT Numeric(9, 0) Not Null ) With ( Data_Source = SAPHANA_HNQ, Location = 'TCURR' ); Go -- 现在查询应该能正常返回数据了 Select * From SAP.TCURR;
方案二:修正Location参数的引号格式
如果你不想修改默认Schema,可以调整Location参数的写法,确保SQL Server把正确的带双引号的限定表名传递给HANA。需要用单引号包裹双引号的表名(因为SQL Server字符串里的双引号需要正确转义):
Create External Table SAP.TCURR ( -- 列定义不变 MANDT NVarChar(3) Not Null, KURST NVarChar(4) Not Null, FCURR NVarChar(5) Not Null, TCURR NVarChar(5) Not Null, GDATU NVarChar(8) Not Null, UKURS Numeric(9, 5) Not Null, FFACT Numeric(9, 0) Not Null, TFACT Numeric(9, 0) Not Null ) With ( Data_Source = SAPHANA_HNQ, Location = '''"SAPABAP1"."TCURR"''' );
这里的'''"SAPABAP1"."TCURR"'''表示在SQL Server字符串中,先转义外层的单引号,最终传递给HANA的是"SAPABAP1"."TCURR",和你OpenQuery里的写法一致。
额外建议
SQL Server 2019 RTM版本存在一些ODBC外部表的兼容性bug,建议安装最新的累积更新(CU),能避免很多类似的驱动交互问题。另外,确保你使用的HDBODBC驱动是最新版本,SAP官方会定期更新驱动来优化和SQL Server的兼容性。
内容的提问来源于stack exchange,提问作者Rachel Ambler

