以下部分介绍针对 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 数据提供程序