【问题标题】:Sql Server 2019 External Table to SAP HANA ignoring Schema in Location clauseSql Server 2019 外部表到 SAP HANA 忽略位置子句中的架构
【发布时间】:2019-12-19 15:17:47
【问题描述】:

我正在寻找一种更好的方法将数据从 Hana 引入我们的 Sql Server EDW。目前我们正在使用OpenQuery,但我真的很想使用 Sql Server 的外部表功能,因为这样我就可以轻松地将大部分计算需求推送到 Hana,而无需创建复杂的查询字符串。

然而,我的第一次尝试被证明是令人沮丧的,因为显然决定始终使用我的默认架构,而不是我提供的架构。

这是我用来从我们的 Hana 实例之一中拉回 SAPABAP1.TCURR 的测试代码(由于通常的原因,某些细节被掩盖了)

If Object_Id('SAP.TCURR') Is Not Null
    Drop External Table SAP.TCURR;
Go
If Exists (Select 1 From sys.external_data_sources Where name = 'SAPHANA_HNQ')
    Drop External Data Source SAPHANA_HNQ;
Go
If Exists (Select 1 From sys.database_credentials Where name = 'Me@Hana')
    Drop Database Scoped Credential Me@Hana;
Go
Create Database Scoped Credential Me@Hana With
     Identity = 'rambler'
    ,Secret = '**SuperSecretSquirrelPassword**';
Go
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'
    );
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 = '"SAPABAP1"."TCURR"'
    );

Go
Select   *
  From   SAP.TCURR;

但是,当我执行此操作时,出现以下错误:

Msg 7320, Level 16, State 110, Line 28
Cannot execute the query "Remote Query" against OLE DB provider "MSOLEDBSQL" for linked server "(null)". 105082;Generic ODBC error: [SAP AG][LIBODBCHDB DLL][HDBODBC] Base table or view not found;259 invalid table name:  Could not find table/view TCURR in schema RAMBLER: line 1 col 77 (at pos 76) .

我在这里做错了什么,导致驱动程序想要使用我的架构 rambler 而不是我给它的架构 SAPABAP1?我还尝试将Location 定义为SAPABAP1.TCURR,但这没有任何区别。

作为记录,以下OpenQuery返回数据就好了:

Select * From OpenQuery(SAPHANA_HNQ, 'Select * From "SAPABAP1"."TCURR"');

Sql Server 2019 RTM

【问题讨论】:

  • 如果 HANA 数据库使用的是最新版本,您可能使用的是 租户 数据库。仅使用 IP 和默认端口(例如 00)连接可以连接到 SystemDB - 这就是您的应用程序表不存在的原因。
  • 但我不是。链接服务器连接和外部表数据源连接都连接到相同的 IP 和端口#
  • 好吧,查看来自 SQL Server 的错误消息(之前应该这样做),我注意到,它尝试在您的架构 RAMBLER 中查找表,而不是使用提供的架构名称.在 SQL Server 文档中,Oracle 的示例在 Location 参数的架构名称前包含一个额外的点 .。所以也许可以尝试 `Location='."SAPABAP1"."TCURR"' 让 SQL Server 使用架构名称。
  • 谢谢 - 我会试试,明天告诉你,@LarsBr。

标签: sql-server hana external-tables


【解决方案1】:

这些对我有用

位置 = '.SAPABAP1.TCURR'

【讨论】:

  • 完美!谢谢! :)
【解决方案2】:

您可以尝试定义远程端的架构和对象吗?

) With
(
     Data_Source = SAPHANA_HNQ,
     SCHEMA_NAME = 'SAPABAP1',
     OBJECT_NAME = 'TCURR'  
);

【讨论】:

  • 如果可以,我会的。尝试时出现以下错误:Msg 102, Level 15, State 2, Line 28 Incorrect syntax near 'Schema_Name'。
  • :) ,看起来很合适。您可以尝试使用 IDENTITY = SAPABAP1... 创建一个新凭证,看看它是否有任何不同。另外,在 OPENQUERY : Select * From OpenQuery(SAPHANA_HNQ ...SAPHANA_HNQ is a linked server isnt'it? 检查链接服务器的 DSN,是否定义了 DATABASE 属性,如果有,则在数据源连接选项:Connection_Options = 'Driver={HDBODBC};ServerNode=10.10.10.10:30015;DATABASE=xyz'
  • 链接服务器的系统 DSN 中没有数据库设置。
  • 那么,很可能是链接服务器的安全设置“强加”了 HANA 模式。您能否检查链接服务器是否模拟/连接为 SAPABAP1(而不是漫游器)?
  • 绝对没有。我设置它只是为了这个测试。
猜你喜欢
  • 2022-07-04
  • 2018-05-31
  • 1970-01-01
  • 2019-04-15
  • 2020-06-22
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多