下列各節說明針對 mySAP Business Suite 的 .NET Framework Data Provider 來執行 SELECT 查詢的文法規格。 請注意,在幾種情況下,語法與基底的 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 ]
Where < const > = integer | real | string | ? | NULL | xml_element
。
OPTION 關鍵字的值
您可以指定選項,如下所示 OPTION '<option>'
: <option> = 'no_conversion' | 'batchsize <size>' | 'disabledatavalidation'
No_conversion選項:
如果使用 no_conversion 選項,則會使用對等的 .net 類型來公開資料表中的欄位。 如需有關 .NET 與 SAP 資料類型相等的詳細資訊,請參閱 基本的 Sap 資料類型。
如果未使用 no_conversion 選項,而且欄位未定義轉換結束,則會使用對等的 .net 類型來公開資料表中的欄位。 如需有關 .NET 與 SAP 資料類型相等的詳細資訊,請參閱 基本的 Sap 資料類型。
未使用 no_conversion 選項,且如果欄位已定義轉換結束,則資料表中的欄位會公開為 .net 字串。
當設定為batchsize < size >時,執行 SELECT 語句會導致對 SAP 系統進行多個呼叫,而在每次呼叫中,只 < 會抓取大小 > 的記錄數目。 例如,如果您指定 ' batchsize 100 ',則 SELECT 查詢只會在每次對 SAP 系統的呼叫中取得100記錄。 如果未指定batchsize < 大小 > ,則會假設為批次大小的預設值10000。 請注意,您應該根據電腦的實體記憶體和 SAP 系統中的資料列數,指定批次大小的最佳值。 指定批次大小的最佳值失敗可能會導致記憶體不足的例外狀況。
當設定為disabledatavalidation時,SAP 的 Data Provider 不會驗證出現在 [dat]、[TIMS] 和 [NUMC] 資料行中的值,而是將它們公開為字串。
這在 ADO.NET 用戶端無法從在 DAT、TIMS 和 NUMC 資料行中具有無效資料的 SAP 資料表中取得資料時,這非常有用。 因為 SAP 允許在 DAT、TIMS 和 NUMC 資料行中有不正確資料,所以嘗試讀取資料的 ADO.NET 用戶端將無法剖析不正確資料,而且會擲回例外狀況。 如果在 SELECT 查詢上設定disabledatavalidation選項,則 SAP 的 Data Provider 不會剖析不正確資料,而是以字串的形式加以解壓縮。
您必須一律在單引號中提供 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 語句時的考慮
當您使用 SELECT 語句搭配適用于 SAP 的 Data Provider 時,此區段會列出您必須記住的重點。
在參數或查詢中指定日期時間值時,請以字串形式提供值。 提供 SAP 日期時間格式的日期時間字串。
SAP date format
: YYYYMMDD
例如,SAP 查詢中的日期 2004 11 月10日表示為 ' 20041110 '。
SAPParameter p1 中的日期2004年11月10日是字串 p1。值 = ' 20041110 '。
SAP time format
: HHMMSS
例如,SAP 查詢中的時間10:34:32 表示為 ' 103432 '。
SAPParameter p2 中的時間10:34:32 是字串 p2。值 = ' 103432 '。
針對 SELECT 語句,SAP DATE
的 Data Provider 會以 .net System.DateTime
物件的形式傳回域值,並 TIME
以物件的形式 System.TimeSpan
傳回域值。 如果 sap DATE
物件的值小於 SQL Server (1/1/1753
) 的最小值,則適用于 SAP 的 Data Provider 會傳回這個最小值 1/1/1753
。
在 SELECT 查詢的 TOP 子句中,如果在整數之前或之後使用特殊字元 "#"、"^"、 & "" 和 "%",則會忽略特殊字元,但不會引發任何錯誤訊息。 例如,SELECT 查詢的 TOP 子句中會忽略下列各項:
#5、5 ^、%5% 或 & 5
不過,在整數之間使用這些字元(如 5 $ 5)會擲回錯誤。
資料表架構中傳回的資料行名稱會以所有大寫字元傳回。 例如,欄位 Last Name
上的查詢結果集會傳回資料行標題 LAST NAME
。 為了避免唯一性衝突,建議使用 SELECT 語句中的全部大寫。
在 SELECT 查詢的 LIKE 子句中,只有百分比符號 "%" (零或多個字元的任何字串) ,而底線 " _" (適用于任何單一字元) ,則為允許的特殊字元。 所有其他特殊字元都視為字串值,而且會被忽略。
sap 的 Data Provider 使用 Z_EXTRACT_DATA_OO RFC 在 SAP 系統上執行 SELECT 查詢。 RFC 支援從符合下列條件的資料表讀取資料:
資料表的 TabClass 是 TRANSP、叢集或 POOL。
TabClass 為 VIEW,而 ViewClass 為 D 或 P。
請確定 SELECT 語句會從符合這些條件的資料表中讀取資料。
可能會超過255個字元的資料類型值,例如 STRING、RAWSTRING、LRAW、VARC 和 LCHAR 不能用在 SELECT 查詢中。 sap 的 Data Provider 會使用隨附于 sap adapter 的自訂 RFC Z_EXTRACT_DATA_OO,在 sap 系統上執行 SELECT 查詢。 此自訂 RFC 不支援任何可能超過255個字元的資料類型。
SELECT 語句中支援的資料行或欄位數目上限為1000。
WHERE 子句中支援的最大述詞數目是100。
不支援在相同的 SELECT 語句中多次選取相同的欄位。 適用于 SAP 的 Data Provider 所使用的自訂 RFC (Z_EXTRACT_DATA_OO) 會在執行之前,從語句中移除重複的欄位。 例如,下列語句:
SELECT BUKRS, BUKRS, BUKRS from T001
如同以下列語句撰寫一樣執行:
SELECT BUKRS from T001
適用于 SAP 的 Data Provider 不支援 SELECT 語句中重複的別名名稱。 因此,下列 SELECT 語句會擲回錯誤:
SELECT KUNNR AS [MYKNA1], JMJAH AS MYKNA1 from KNA1 where KUNNR LIKE 'T-S62A08' AND JMJAH=1995
適用于 SAP 的 Data Provider 不支援含有重復資料行名稱的 SELECT 語句。 因此,下列 SELECT 語句會擲回錯誤:
SELECT KUNNR AS [MYKNA1], KUNNR AS MYKNA2 from KNA1 where MYKNA2='T-S62A08'
SAP 不會將 Null 值儲存在資料表中。 因此,SAP 的 Data Provider 不支援 SELECT 語句中的 "Null" 值。 因此,下列 SELECT 語句會擲回錯誤:
SELECT NAME1, PSTLZ from KNA1 where CITY IS NULL AND NAME1 LIKE '%MODE%'
適用于 SAP 的 Data Provider 不支援 SELECT 語句中的 ORDER BY 子句。 因此,下列 SELECT 語句會擲回錯誤:
SELECT NAME1 AS [MYNAME], LAND1, KUNNR from KNA1 where NAME1 LIKE '%MODE%' ORDER BY NAME1 ASC
適用于 sap 的 Data Provider 不支援指定星號 ( * ) 來選取 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 子句中只指定 LRAW 欄位,而沒有 PREC 欄位,可能會導致資料解壓縮不正確。
在 SAP 系統中,字元比較會區分大小寫。 因此,下列兩個查詢可能會傳回不同的結果。
SELECT * FROM KNA1 WHERE LAND1 LIKE 'D%'
SELECT * FROM KNA1 WHERE LAND1 LIKE 'd%'
請確定您在框架選取查詢時使用正確的案例。 此外,在 SAP 系統中,並非所有資料行都可以包含小寫或大寫字元。 您可以使用 SAP GUI 來找出資料表中的資料行是否儲存小寫或大寫字元。 如需使用 SAP GUI 的指示,請參閱 判斷資料行是否儲存小寫或大寫值。
只有當域值與某個資料值的比較,而 不 是其他資料表域值的比較時,才支援 WHERE 條件。 因為 SAP 的 Data Provider 只支援一個資料表 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 系統取出字串類型的資料行。
SELECT 語句必須只包含單一聯結。 例如:
select * from spfli inner join sflight on spfli.carrid = sflight.carrid
關於 .NET Framework Data Provider for mySAP Business Suite