ExecuteSQL
目的
指定したテーブルオカレンスに対する SQL クエリーステートメントを FileMaker Pro ファイル内で実行します。
構文
ExecuteSQL ( SQL クエリー ; フィールド区切り ; 行区切り { ; 引数...} )
引数
SQL クエリー - SQL SELECT ステートメント。ステートメントには、2 つのクエリーの結果を組み合わせた Union 句を含むことができます。ステートメントには、オプションの引数がクエリーのどこで使用されるかを示す、プログラムに基づいて生成された SQL (ダイナミック引数) を含むことができます。ダイナミック引数を指定する場合は疑問符 (?) を使用します。
フィールド区切り - 計算結果のフィールド間の区切りとして使用される文字列。空の文字列が指定されると、区切りはコンマになります。フィールド区切りは、計算結果の最終フィールドの後には表示されません。
行区切り - 計算結果の中のレコード間の区切りとして使用される文字列。空の文字列が指定されると、区切りは改行になります。行区切りは、計算結果の最終行の後には表示されません。
引数- クエリーステートメントのダイナミック引数の値として評価、使用される
式。
戻り値のデータタイプ
テキスト
起点
FileMaker Pro 12.0
説明
ExecuteSQL では、インジェクション攻撃によるセキュリティの脆弱性を避けるために、 FileMaker Pro データベースを安全にクエリーするためのダイナミック引数を含む SQL SELECT ステートメントを実行します。
ExecuteSQL は、FileMaker Pro で作成されたリレーションシップを認識しないため、SQL ステートメントでリレーションシップを柔軟に定義し、レイアウトコンテキストに関係なく、あらゆるテーブルからデータを取得できます。
ExecuteSQL は、データまたはデータベーススキーマを変更する SQL ステートメント (テーブルを挿入または削除するコマンドなど) と同時に使用することはできません。
クエリー解析または実行時にエラーが発生した場合、FileMaker Pro は「?」を返します。
メモ
•SQL クエリーに適切な日付書式を適用するには、DATE ステートメントを使用します。DATE ステートメントを使用しないと、ExecuteSQL では、日付がリテラル文字列として処理されます。
•FileMaker Pro は、オペレーティングシステムやファイルのロケールではなく、Unicode/SQL 形式で日時や数字データを返します。
•ExecuteSQL では、カッコのない SQL-92 構文 ISO 日付および時刻書式のみを使用できます。ExecuteSQL では、ODBC/JDBC 書式のカッコ付きの日付、時刻、タイムスタンプ定数は使用できません。
•FileMaker SQL は、Unicode バイナリソート順を使用します。これは言語のソートやデフォルトの言語のニュートラルなソート順で使用される FileMaker Pro のソート順とは異なります。
例 1
EmpID フィールドで関連付けられる、Employee と Salaries の 2 つのテーブルがデータベースに含まれているとします。
メモ Employee::EmpID、Salaries::EmpID、および Salaries::Salary フィールドは数字フィールドです。
ExecuteSQL 関数を使用して、現在のレコードや対象レコードを変更せずに、特定のレコードからフィールド値を返すことができます。
ExecuteSQL ( "SELECT Department FROM Employee WHERE EmpID = 1" ; "" ; "" ) は、現在のレコード、対象レコード、またはレイアウトにかかわらず「開発」を返します。
例 2
Employee テーブルに、Department 全体の Salaries に対する個々の Employee の Salary の割合を表示するフィールドを追加するとします。FileMaker Pro の計算を使用してこの値を出すことは可能ですが、ExecuteSQL 関数でダイナミック引数を使用してこのクエリーを指定できます。次の例では、各フィールド (S.Salary、E.EmpID、および S.EmpID) の指定に Employee テーブルのテーブルエイリアス (E) と Salaries テーブルのテーブルエイリアス (S) を使用しています。
Employee テーブルで計算フィールドを定義し、ExecuteSQL 関数を使用して次のクエリーステートメントを指定します。
Round (
100 * Salaries::Salary / ExecuteSQL (
"SELECT SUM (S.Salary)
FROM Employee E
JOIN Salaries S
ON E.EmpID = S.EmpID
WHERE E.Department = ?";
""; ""; Employee::Department
) ;
2 )
各 Employee のレコードで、計算フィールドには Employee の Department 全体の Salaries に対する個々の Employee の Salary の割合が表示されます。たとえば、姓が「Smith」のレコードは、「52.97」を返し、姓が「斉藤」のレコードは「100」を返します。
関連項目