ExecuteSQL
指定したテーブルオカレンスに対する SQL クエリーステートメントを FileMaker Pro ファイル内で実行します。
構文
ExecuteSQL (SQL クエリー ; フィールド区切り ; 行区切り {; 引数...})
引数
SQL クエリー
- SQL SELECT ステートメント。ステートメントには、2 つのクエリーの結果を組み合わせた Union 句を含むことができます。ステートメントには、オプションの引数がクエリーのどこで使用されるかを示す、プログラムに基づいて生成された SQL (ダイナミック引数) を含むことができます。ダイナミック引数を指定する場合は疑問符 (?) を使用します。
フィールド区切り
- 計算結果のフィールド間の区切りとして使用される文字列。空の文字列が指定されると、区切りはコンマになります。フィールド区切りは、計算結果の最終フィールドの後には表示されません。
行区切り
- 計算結果の中のレコード間の区切りとして使用される文字列。空の文字列が指定されると、区切りは改行になります。行区切りは、計算結果の最終行の後には表示されません。
引数
- クエリーステートメントのダイナミック引数の値として評価および使用される 1 つまたは複数のセミコロン (;) で区切られた式。
戻り値のデータタイプ
テキスト
起点バージョン
12.0
説明
ExecuteSQL では、インジェクション攻撃によるセキュリティの脆弱性を避けるために、FileMaker Pro データベースを安全にクエリーするためのダイナミック引数を含む SQL SELECT ステートメントを実行します。
ExecuteSQL は、FileMaker Pro で作成されたリレーションシップを認識しないため、SQL ステートメントでリレーションシップを柔軟に定義し、レイアウトコンテキストに関係なく、あらゆるテーブルからデータを取得できます。
ExecuteSQL は、データまたはデータベーススキーマを変更する SQL ステートメント (テーブルを挿入または削除するコマンドなど) と同時に使用することはできません。
SQL クエリー
で複数のダイナミック引数を使用した場合、1 つ目の疑問符文字が 1 つ目の引数
に置き換えられ、2 つ目の疑問符文字が 2 つ目の引数に置き換えられ、3 つ目以降も同じように続きます。
クエリー解析または実行時にエラーが発生した場合、ExecuteSQL は「? 」を返します。 より詳細なエラーメッセージを受け取るには、ExecuteSQLe 関数を使用します。
メモ
- SQL クエリーに適切な日付書式を適用するには、DATE ステートメントを使用します。DATE ステートメントを使用しないと、ExecuteSQL では、日付がリテラル文字列として処理されます。
- FileMaker Pro は、オペレーティングシステムやファイルのロケールではなく、Unicode/SQL 形式で日時や数字データを返します。
- ExecuteSQL では、カッコのない SQL-92 構文 ISO 日付および時刻書式のみを使用できます。ExecuteSQL では、ODBC/JDBC 書式のカッコ付きの日付、時刻、タイムスタンプ定数は使用できません。
- FileMaker SQL は、Unicode バイナリソート順を使用します。これは言語のソートやデフォルトの言語のニュートラルなソート順で使用される FileMaker Pro のソート順とは異なります。
- SELECT ステートメントの構文、サポートされる SQL ステートメント、式、およびカタログ関数については、『FileMaker ODBC と JDBC ガイド』および『FileMaker SQL リファレンス』を参照してください。
- ExecuteSQL 関数では、SQL SELECT ステートメントを使用して、ODBC データソースではなく FileMaker データソース内のテーブルをクエリーします。SELECT ステートメントやその他のサポートされている SQL ステートメントを ODBC データソースに対して実行するには、[SQL を実行] スクリプトステップを使用してください。
例 1
EmpID フィールドで関連付けられる、Employees と Salaries の 2 つのテーブルがデータベースに含まれているとします。
メモ Employees::EmpID、Salaries::EmpID、および Salaries::Salary フィールドは数字フィールドです。
ExecuteSQL 関数を使用して、現在のレコードや対象レコードを変更せずに、特定のレコードからフィールド値を返すことができます。
ExecuteSQL ("SELECT Department FROM Employees WHERE EmpID = 1" ; "" ; "")
は、現在のレコード、対象レコード、またはレイアウトにかかわらず「開発」を返します。
例 2
例 1 では、Employees テーブルに Department 全体の Salaries に対する個々の Employees の Salary の割合を表示するフィールドを追加するとします。FileMaker Pro の計算を使用してこの値を出すことは可能ですが、ExecuteSQL 関数でダイナミック引数を使用してこのクエリーを指定できます。次の例では、各フィールド (S.Salary
、E.EmpID
、および S.EmpID
) の指定に Employees テーブルのテーブルエイリアス (E
) と Salaries テーブルのテーブルエイリアス (S
) を使用しています。
Employees テーブルで計算フィールド (Percent Dept Salaries) を定義し、ExecuteSQL 関数を使用して次の計算のクエリーステートメントを指定します:
Round (
100 * Salaries::Salary / ExecuteSQL (
"SELECT SUM (S.Salary)
FROM Employees E
JOIN Salaries S
ON E.EmpID = S.EmpID
WHERE E.Department = ?";
""; ""; Employees::Department
) ;
2)
メモ この計算では Salaries テーブル (Salaries::Salary) から従業員の給与を取得する必要があるため、リレーションシップグラフの Employees::EmpID フィールドと Salaries::EmpID フィールドの間にリレーションシップを作成する必要があります (リレーションシップの作成と変更を参照してください)。一方、ExecuteSQL 関数ではリレーションシップグラフを使用しません。したがってこの例では、JOIN 句は ExecuteSQL の SELECT ステートメントで使用されるリレーションシップを確立します。
各 Employees のレコードで、Percent Dept Salaries フィールドでは Employees の Department 全体の Salaries に対する個々の Employees の Salary の割合が計算されます。
Employees | |||
---|---|---|---|
EmpID | Last Name | Department | Percent Dept Salaries |
1 | Smith | 開発 | 52.97 |
2 | 小川 | 開発 | 47.03 |
3 | 坂田 | 品質保証 | 48.86 |
4 | 村上 | 品質保証 | 51.14 |
5 | 斉藤 | マニュアル | 100 |
6 | 大島 | マーケティング | 100 |