共用方式為


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域值傳回為 .NET System.DateTime 物件,並將域值當做System.TimeSpan對象傳回TIME。 如果 SAP DATE 物件的值小於允許的最小 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  
    

另請參閱

關於 .NET Framework Data Provider for mySAP Business Suite