SAP 中 SELECT 語句的語法
下列各節說明針對 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 語句時的考慮
本節列出搭配使用 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 的數據提供者會將
DATE
域值傳回為 .NETSystem.DateTime
物件,並將域值當做System.TimeSpan
對象傳回TIME
。 如果 SAPDATE
物件的值小於允許的最小 SQL Server 值 (1/1/1753
) ,則 Data Provider for 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 語句會從符合這些條件的數據表讀取數據。
可能需要超過 255 個字元的數據類型值,例如 STRING、RAWSTRING、LRAW、VARC 和 LCHAR 不能用於 SELECT 查詢中。 適用於 SAP 的數據提供者會使用隨附於 SAP 配接器Z_EXTRACT_DATA_OO的自定義 RFC,在 SAP 系統上執行 SELECT 查詢。 此自定義 RFC 不支援任何可能需要超過 255 個字元的數據類型。
SELECT 語句中支持的數據行或欄位數目上限為 1000。
WHERE 子句中支援的述詞數目上限為 100。
不支援在相同的SELECT語句中多次選取相同的欄位。 數據提供者 for 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
Data Provider for SAP 不支援具有重複數據行名稱的 SELECT 語句。 因此,下列 SELECT 語句會擲回錯誤:
SELECT KUNNR AS [MYKNA1], KUNNR AS MYKNA2 from KNA1 where MYKNA2='T-S62A08'
SAP 不會將 NULL 值儲存在資料表中。 因此,DATA Provider for SAP 不支援 SELECT 語句中的“IS NULL” 值。 因此,下列 SELECT 語句會擲回錯誤:
SELECT NAME1, PSTLZ from KNA1 where CITY IS NULL AND NAME1 LIKE '%MODE%'
DATA Provider for 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 子句中指定 LRAW 欄位而不使用 PREC 欄位,可能會導致擷取不正確的數據。
在 SAP 系統中,字元比較會區分大小寫。 因此,下列兩個查詢可能會傳回不同的結果。
SELECT * FROM KNA1 WHERE LAND1 LIKE 'D%'
和
SELECT * FROM KNA1 WHERE LAND1 LIKE 'd%'
請確定您在框架化選取查詢時使用正確的案例。 此外,在 SAP 系統中,並非所有數據行都可以包含小寫或大寫字元。 您可以使用 SAP GUI 來找出資料表中的資料行是否儲存小寫或大寫字元。 如需使用 SAP GUI 的指示,請參閱判斷數據 行是否儲存小寫或大寫值。
WHERE 條件僅支援與某些數據值的域值比較, 而非 其他數據表域值。 因為 Data Provider for 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