添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

以下部分介绍针对 mySAP Business Suite 的 .NET Framework Data Provider 实现 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 String。

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

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

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

    必须始终在单引号内提供 OPTION 关键字的值,例如"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 语句时注意事项

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

  • 在参数或查询中指定日期时间值时,以字符串形式提供这些值。 以 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 数据提供程序将 DATE 字段值作为 .NET System.DateTime 对象 TIME 返回,并返回字段值作为 System.TimeSpan 对象。 如果 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 数据 (Z_EXTRACT_DATA_OO) 使用的自定义 RFC 命令在执行之前从 语句中删除重复字段。 例如,此语句:

    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")的写入权限。

  • 使用 DATA Provider for 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 子句中指定不带 PREC 字段的 LRAW 字段可能会导致提取不正确的数据。

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

    SELECT * FROM KNA1 WHERE LAND1 LIKE 'D%'  
    
    SELECT * FROM KNA1 WHERE LAND1 LIKE 'd%'  
    

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

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

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

    下面是正确的 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 语句只能在联接子句中包含 "等于" 条件。 例如:

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

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

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

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

  •