SAP の SELECT ステートメントの構文
以降のセクションでは、.NET Framework Data Provider for mySAP Business Suite に対して 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 として公開されます。
batchsize size <>に設定すると、SELECT ステートメントを実行すると、SAP システムに対して複数の呼び出しが行われ、各呼び出しでは、レコードのサイズ>数のみが<取得されます。 たとえば、'batchsize 100' を指定した場合、SELECT クエリは SAP システムへの各呼び出しでのみ 100 レコードを取得します。 batchsize size <> が指定されていない場合、バッチ サイズの既定値は 10,000 と見なされます。 コンピューターの物理メモリと SAP システムの行数に基づいて、バッチ サイズに最適な値を指定する必要があることに注意してください。 バッチ サイズに最適な値を指定できないと、メモリ不足の例外が発生する可能性があります。
disabledatavalidation に設定すると、DATA Provider for SAP は DATS、TIMS、NUMC 列に存在する値を検証せず、代わりに文字列として公開します。
これは、ADO.NET クライアントが DATS、TIMS、NUMC 列で無効なデータを持つ SAP テーブルからデータを取得できないシナリオで役立ちます。 SAP では無効なデータが DATS、TIMS、NUMC 列に存在することを許可しているため、データの読み取りを試みる ADO.NET クライアントは無効なデータを解析できず、例外をスローします。 SELECT クエリで disabledatavalidation オプションが設定されている場合、DATA Provider for SAP では無効なデータは解析されず、文字列として抽出されます。
重要
OPTION キーワード (keyword)の値は、常に単一引用符 ("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 ステートメントを呼び出すときの考慮事項
このセクションでは、DATA Provider for 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 ステートメントの場合、DATA Provider for SAP はフィールド値を .NET
System.DateTime
オブジェクトとして返DATE
し、フィールド値をTIME
オブジェクトとしてSystem.TimeSpan
返します。 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 句では、パーセント記号 "%" (0 個以上の文字列の場合)、アンダースコア "_" (任意の 1 文字の場合) のみが使用できます。 その他のすべての特殊文字は文字列値と見なされ、無視されます。
SAP 用データ プロバイダーは、Z_EXTRACT_DATA_OO RFC を使用して、SAP システムで SELECT クエリを実行します。 RFC では、次の条件を満たすテーブルからのデータの読み取りがサポートされています。
テーブルの TabClass は TRANSP、CUSTER、または POOL です。
TabClass は VIEW で、ViewClass は D または P です。
SELECT ステートメントが、これらの条件を満たすテーブルからデータを読み取っていることを確認します。
STRING、RAWSTRING、LRAW、VARC、LCHAR など、255 文字を超えるデータ型の値を SELECT クエリで使用することはできません。 SAP 用データ プロバイダーは、SAP アダプターに付属するカスタム RFC (Z_EXTRACT_DATA_OO) を使用して、SAP システムで SELECT クエリを実行します。 このカスタム RFC では、255 文字を超えるデータ型はサポートされていません。
SELECT ステートメントでサポートされる列またはフィールドの最大数は 1000 です。
WHERE 句でサポートされる述語の最大数は 100 です。
同じ SELECT ステートメントで同じフィールドを複数回選択することはサポートされていません。 Data Provider for SAP によって使用されるカスタム RFC (Z_EXTRACT_DATA_OO) は、実行する前にステートメントから重複するフィールドを削除します。 たとえば、次のステートメントを使用します。
SELECT BUKRS, BUKRS, BUKRS from T001
は、次のステートメントのように記述されたかのように実行されます。
SELECT BUKRS from T001
DATA Provider for 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
DATA Provider for 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 サービス アカウントに"共有" という名前のネットワーク共有への書き込みアクセス許可が必要です。
DATA Provider for SAP を使用する SELECT ステートメントでは、SELECT クエリの引数値のパラメーター名がサポートされています。 ただし、パラメーター名に関しては、次の規則に従ってください。
SELECT クエリでは、パラメーター名の前に "@" 記号が付く必要があります。
"@" 記号の後にアルファベット文字 (A~Z または a-z) を付ける必要があります。
パラメーター名には、英数字 (A-Z、a-z、または 0 から 9) と特殊文字を含めることができます。 パラメーター名に含めることができる特殊文字は、アンダースコア "_" とハッシュ "#" のみです。
ビューで SELECT クエリを実行する場合は、ベース テーブルのすべての主キー列もビューに存在することを確認します。 また、実際には、ビューでも列を主キー列としてマークする必要があります。
主キー列がビューに存在しない場合、ビューに対する SELECT クエリによって例外が発生します。
テーブルで SELECT クエリを実行して LRAW 型のフィールドを選択する場合は、対応する PREC フィールドを選択してください。 また、SELECT 句の LRAW フィールドの直前に PREC フィールドを指定する必要があります。
テーブル内のすべての LRAW フィールドには、LRAW フィールドにデータの長さを格納する対応する PREC フィールドがあります。 SELECT 句で PREC フィールドを指定せずに LRAW フィールドだけを指定すると、正しくないデータが抽出される可能性があります。
SAP システムでは、文字比較では大文字と小文字が区別されます。 そのため、次の 2 つのクエリで異なる結果が返される場合があります。
SELECT * FROM KNA1 WHERE LAND1 LIKE 'D%'
および
SELECT * FROM KNA1 WHERE LAND1 LIKE 'd%'
選択クエリをフレーミングするときは、適切なケースを使用してください。 また、SAP システムでは、すべての列に小文字または大文字を含めることができるわけではありません。 SAP GUI を使用して、テーブル内の列に小文字と大文字のどちらを格納するかを確認できます。 SAP GUI の使用方法については、「 列が小文字と大文字のどちらを格納するかを決定する」を参照してください。
WHERE 条件は、あるデータ値を持つフィールド値を比較する場合にのみサポートされ、他のテーブル フィールド値とは比較 できません 。 Data Provider for SAP では 1 つのテーブル 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 ステートメントは、STRING 型の列を SAP システムから取得しません。
SELECT ステートメントには、1 つの JOIN のみを含む必要があります。 次に例を示します。
select * from spfli inner join sflight on spfli.carrid = sflight.carrid