SAP 中 SELECT 语句的语法

以下各节介绍针对 .NET Framework Data Provider for mySAP Business Suite 实现 SELECT 查询的语法规范。 请注意,在某些情况下,语法与基本 Transact-SQL 语法稍有不同。

SELECT {TOP <const> }[0,1] <select_list>  {INTO FILE [‘file_name’ | “file_name”]   
{DELIMITED}[0,1]}[0,1]  FROM table_name  {AS alias_name }[0,1]    
{INNER JOIN table_name {AS alias_name}[0,1] ON  <Join_Condition>}[0,1]  
{ WHERE <predicate> } [0,1] {;}[0,1]   
[OPTION 'no_conversion' | 'batchsize <size>' | 'disabledatavalidation'  

其中:

  • <select_list> = [ {table_name.}[0,1]column_name { AS alias_name } [0,1] } [ 1, …n ]

  • <Join_Condition> = [Alias_name.|table_name.]column_name <expr> [Alias_name.|table_name.]column_name

  • <谓词> = [ predicate [AND|OR] predicate [between|not between] predicate | NOT predicate | ‘(‘ predicate ‘)’ | condition ]

    支持的条件和表达式包括:

  • <条件> = [ expr | expr [NOT | ] BETWEEN const AND const | expr [NOT | ] LIKE const ]

  • <expr> = [ const | column_name [= | ! = | > | > = | ! > | < | < = | ! < ] const | column_name | - const | const | column_name ]

    其中 <const> = integer | real | string | ? | NULL | xml_element

    OPTION 关键字的值

    可以将选项指定为 OPTION '<option>',其中 <option> = 'no_conversion' | 'batchsize <size>' | 'disabledatavalidation'

  • no_conversion选项:

    • 如果使用 no_conversion 选项,则使用等效的 .NET 类型公开表中的字段。 有关 SAP 数据类型的 .NET 等效项的信息,请参阅 基本 SAP 数据类型

    • 如果未使用 no_conversion 选项,并且字段未定义转换退出,则使用等效的 .NET 类型公开表中的这些字段。 有关 SAP 数据类型的 .NET 等效项的信息,请参阅 基本 SAP 数据类型

    • 如果未使用 no_conversion 选项,并且某个字段定义了转换退出,则表中的这些字段将公开为 .NET 字符串。

  • 如果设置为批处理大小<>,则 SELECT 语句的执行会导致对 SAP 系统进行多次调用,并且在每个调用中,仅<检索记录的大小>数。 例如,如果指定“batchsize 100”,则 SELECT 查询仅在每次调用 SAP 系统时检索 100 条记录。 如果未指定批处理大小<>,则批大小假定默认值为 10,000。 请注意,应根据计算机的物理内存和 SAP 系统中的行数为批大小指定最佳值。 未能为批大小指定最佳值可能会导致内存不足异常。

  • 设置为 disabledatavalidation 时,适用于 SAP 的数据提供程序不会验证 DATS、TIMS 和 NUMC 列中存在的值,而是将它们作为字符串公开。

    如果 ADO.NET 客户端无法从具有 DATS、TIMS 和 NUMC 列中无效数据的 SAP 表检索数据,这非常有用。 由于 SAP 允许在 DATS、TIMS 和 NUMC 列中显示无效数据,因此尝试读取数据的 ADO.NET 客户端将无法分析无效数据,并引发异常。 如果在 SELECT 查询上设置了 disabledatavalidation 选项,则 SAP 数据提供程序不会分析无效数据,而是将其提取为字符串。

重要

必须始终在单引号内提供 OPTION 关键字 (keyword) 的值,例如“disabledatavalidation”。

有关示例语句,请参阅 SELECT 语句的示例

谓词语法

下面指定在 SELECT 语句中使用谓词的语法:

Predicate:

Predicates [AND | OR] Predicates [between|not between] Predicates | [NOT] Predicates | '(' Predicates ')' | Condition  

Condition:

Expr | LExpr [NOT] BETWEEN RExpr AND RExpr | LExpr [NOT] LIKE Const  

Expr:

LExpr [=|!=|>|>=|!>|<|<=|!<] RExpr>  

LExpr:

ColumnName  

RExpr:

Const | PlaceHolder  

ColumnName:

Column | TableName.Column | '['Column']'  

Tablename:

Table | '['Table']'  

调用 SELECT 语句时的注意事项

本部分列出了将 SELECT 语句用于 SAP 数据提供程序时必须记住的要点。

  • 在参数或查询中指定日期时间值时,请以字符串的形式提供值。 以 SAP 日期时间格式提供日期时间字符串。

    • SAP date format:YYYYMMDD

      例如,SAP 查询中的日期 2004 年 11 月 10 日表示为“20041110”。

      SAPParameter p1 中的日期 2004 年 11 月 10 日是字符串 p1。Value='20041110'。

    • SAP time format:HHMMSS

      例如,SAP 查询中的时间 10:34:32 表示为“103432”。

      SAPParameter p2 中的时间 10:34:32 是字符串 p2。Value='103432'。

      对于 SELECT 语句,SAP 数据提供程序将字段值作为 .NET 对象返回DATE,并将字段值作为 System.TimeSpan 对象返回TIMESystem.DateTime 如果 SAP DATE 对象的值小于 () 允许的1/1/1753最小SQL Server值,则 SAP 数据提供程序返回此最小值 1/1/1753

  • 在 SELECT 查询的 TOP 子句中,在整数之前或之后使用特殊字符“#”、“^”、“&”和“%”时,特殊字符将被忽略,但不会引发错误消息。 例如,在 SELECT 查询的 TOP 子句中忽略以下内容:

    #5、5^、%5% 或 &5

    但是,在整数之间使用这些字符(如 5$5)会引发错误。

  • 表的架构中返回的列名以所有大写字符的形式返回。 例如,字段 Last Name 上的查询结果集返回列标题 LAST NAME。 为了避免唯一性冲突,建议在 SELECT 语句中使用所有大写。

  • 在 SELECT 查询的 LIKE 子句中,对于任何包含零个或多个字符) 的字符串,仅百分号“%” (,以及任何单个字符) 的下划线 “_” (都是允许的特殊字符。 所有其他特殊字符被视为字符串值,将被忽略。

  • 适用于 SAP 的数据提供程序使用 Z_EXTRACT_DATA_OO RFC 对 SAP 系统执行 SELECT 查询。 RFC 支持从满足以下条件的表读取数据:

    • 表的 TabClass 为 TRANSP、CUSTER 或 POOL。

    • TabClass 为 VIEW,ViewClass 为 D 或 P。

      确保 SELECT 语句从满足这些条件的表读取数据。

  • 不能在 SELECT 查询中使用可能需要超过 255 个字符的数据类型的值,例如 STRING、RAWSTRING、LRAW、VARC 和 LCHAR。 SAP 数据提供程序使用 SAP 适配器附带的自定义 RFC(Z_EXTRACT_DATA_OO)对 SAP 系统执行 SELECT 查询。 此自定义 RFC 不支持任何可能超过 255 个字符的数据类型。

  • SELECT 语句中支持的最大列或字段数为 1000。

  • WHERE 子句中支持的最大谓词数为 100。

  • 不支持在同一 SELECT 语句中多次选择同一字段。 数据提供程序用于 SAP 的自定义 RFC (Z_EXTRACT_DATA_OO) 在执行之前会从 语句中删除重复字段。 例如,此语句:

    SELECT BUKRS, BUKRS, BUKRS from T001

    执行,就像编写如下语句一样:

    SELECT BUKRS from T001

  • SAP 数据提供程序不支持在 SELECT 语句中重复的别名。 因此,以下 SELECT 语句会引发错误:

    SELECT KUNNR AS [MYKNA1], JMJAH AS MYKNA1 from KNA1 where KUNNR LIKE 'T-S62A08' AND JMJAH=1995  
    
  • SAP 数据提供程序不支持具有重复列名的 SELECT 语句。 因此,以下 SELECT 语句会引发错误:

    SELECT KUNNR AS [MYKNA1], KUNNR AS MYKNA2 from KNA1 where MYKNA2='T-S62A08'  
    
  • SAP 不会在表中存储 NULL 值。 因此,SAP 数据提供程序不支持 SELECT 语句中的“IS NULL”值。 因此,以下 SELECT 语句会引发错误:

    SELECT NAME1, PSTLZ  from KNA1 where CITY IS NULL AND NAME1 LIKE '%MODE%'  
    
  • SAP 数据提供程序在 SELECT 语句中不支持 ORDER BY 子句。 因此,以下 SELECT 语句会引发错误:

    SELECT NAME1  AS [MYNAME],  LAND1, KUNNR  from KNA1 where NAME1 LIKE '%MODE%'  ORDER BY NAME1  ASC  
    
  • SAP 数据提供程序不支持指定星号 (*) 来选择 SAP 表中的所有字段。 因此,以下 SELECT 语句会引发错误:

    SELECT spfli.* from spfli inner join sflight on spfli.carrid = sflight.carrid  
    

    若要选择所有字段,必须单独指定字段名称。

  • 作为 SELECT 语句的一部分,可以指定将 SELECT 语句的输出写入到的文件。 但是,如果输出文件位于网络共享上,请确保运行 SAP 服务的 SAP 服务帐户对网络共享具有写入权限。 例如:

    SELECT * into file '\\share\output.txt' from spfli inner join sflight on spfli.carrid = sflight.carrid  
    

    在前面的示例中,SAP 服务帐户必须具有对名称为“share”的网络共享的写入权限。

  • 使用 SAP 数据提供程序的 SELECT 语句支持 SELECT 查询中参数值的参数名称。 但是,请确保遵循以下有关参数名称的规则:

    • 在 SELECT 查询中,参数名称前面必须有“@”符号。

    • “@”符号后跟字母字符 (A-Z 或 a-z) 。

    • 参数名称可以包含字母数字字符 (A-Z、a-z 或 0-9) 和特殊字符。 参数名称中唯一可以包含的特殊字符是下划线“_”和哈希“#”。

  • 对视图运行 SELECT 查询时,请确保基表的所有主键列也存在于视图中。 此外,在实践中,还必须在“视图”中将列标记为主键列。

    如果视图中不存在主键列,则视图上的 SELECT 查询将导致异常。

  • 对表运行 SELECT 查询以选择 LRAW 类型的字段时,请确保选择相应的 PREC 字段。 此外,PREC 字段必须紧邻 SELECT 子句中的 LRAW 字段之前。

    表中的每个 LRAW 字段都有一个相应的 PREC 字段,用于在 LRAW 字段中存储数据的长度。 在 SELECT 子句中指定 LRAW 字段而不指定 PREC 字段可能会导致提取的数据不正确。

  • 在 SAP 系统中,字符比较区分大小写。 因此,以下两个查询可能会返回不同的结果。

    SELECT * FROM KNA1 WHERE LAND1 LIKE 'D%'  
    

    SELECT * FROM KNA1 WHERE LAND1 LIKE 'd%'  
    

    请确保在构建选择查询时使用正确的大小写。 此外,在 SAP 系统中,并非所有列都可以包含小写或大写字符。 可以使用 SAP GUI 来确定表中的列是存储小写字符还是大写字符。 有关使用 SAP GUI 的说明,请参阅 确定列存储小写还是大写的值

  • WHERE 条件仅支持将字段值与某些数据值进行比较, 而不支持 与其他表字段值进行比较。 由于适用于 SAP 的数据提供程序仅支持一个表 SELECT 查询,因此联接条件中的表字段查询应使用联接条件来支持相同的联接条件。

  • 联接条件必须包含表名。

    下面是正确的 SELECT 语句

    select A.x, B.y from A inner join B on A.m = B.n  
    

    下面是错误的 SELECT 语句

    select A.x, B.y from A inner join B on m = n  
    
  • 在联接条件中,联接条件中的左表应位于条件的左侧,联接条件的右表应在联接条件的右侧指定。

    下面是指定联接条件的正确方法:

    select A.x, B.y from A inner join B on A.m = B.n  
    

    下面是指定联接条件的错误方法:

    select A.x, B.y from A inner join B on B.n = A.m  
    
  • SELECT 语句只能在 JOIN 子句中包含“等于”条件。 例如:

    select * from spfli inner join sflight on spfli.carrid = sflight.carrid  
    
  • SELECT 语句不会从 SAP 系统检索 STRING 类型的列。

  • SELECT 语句只能包含一个 JOIN。 例如:

    select * from spfli inner join sflight on spfli.carrid = sflight.carrid  
    

另请参阅

关于 mySAP Business Suite 的 .NET Framework 数据提供程序