SQL 構文

Windows インストーラーの SQL クエリ文字列は、次の形式に制限されています。

アクション クエリ
レコードのグループを選択する SELECT [DISTINCT]{column-list} FROM {table-list} [WHERE {operation-list}] [ORDER BY {column-list}]
テーブルからレコードを削除する DELETE FROM {table} [WHERE {operation-list}]
テーブル内の既存のレコードを変更する UPDATE {table-list} SET {column}= {constant} [, {column}= {constant}][, ...] [WHERE {operation-list}] UPDATE クエリは、非主キー列でのみ機能します。
テーブルにレコードを追加する INSERT INTO {table} ({column-list}) VALUES ({constant-list}) [TEMPORARY] バイナリ データは、INSERT INTO クエリまたは UPDATE SQL クエリを使用して、テーブルに直接挿入することはできません。 詳細については、「SQL を使用してテーブルにバイナリ データを追加する」を参照してください。
テーブルの追加 CREATE TABLE {table} ( {column} {column type}) [HOLD] テーブルを追加するときには、列ごとに列の型を指定する必要があります。 新しいテーブルを作成するには、少なくとも 1 つの主キー列を指定する必要があります。 上記の {column type} で置換できる値は、次のとおりです。CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [, column...][, ...] PRIMARY KEY column [, column][, ...]。
テーブルを削除する DROP TABLE {table}
列を追加する ALTER TABLE {table} ADD {column} {column type} 列を追加するときには、列の型を指定する必要があります。 上記の {column type} で置換できる値は、次のとおりです。CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [HOLD]。
一時テーブルを保持および解放する ALTER TABLE {table name} HOLDALTER TABLE {table name} FREE
ユーザーは、HOLD コマンドと FREE コマンドを使用して、一時テーブルまたは一時列の有効期間を制御できます。 テーブルでの保持カウントは、そのテーブルに対する SQL HOLD 操作ごとに増加し、テーブルに対する SQL FREE 操作ごとに減少します。 テーブルで最後の保持カウントが解放されると、すべての一時列にアクセスできなくなります。 すべての列が一時的である場合は、テーブルにアクセスできなくなります。

 

詳細については、「SQL とスクリプトを使用したデータベース クエリの例」を参照してください。

SQL 文法

省略可能なパラメーターは、角かっこ [ ] で囲まれて表示されます。 複数の選択肢が記載されている場合、省略可能なパラメーターは、縦棒で区切られます。

{constant} は、文字列または整数のいずれかです。 文字列は、'example' のように単一引用符で囲む必要があります。 {constant-list} は、1 つ以上の定数のコンマ区切りのリストです。

LOCALIZABLE オプションは、列をローカライズする必要があることを示す列属性を設定します。

{column} は、テーブルのフィールド内の値への列参照です。

{marker} は、クエリで送信されたレコードによって指定される値へのパラメーター参照です。 SQL ステートメントでは、疑問符 ? によって表されます。 パラメーターの使用については、MsiViewExecute 関数または Execute メソッドのいずれかを参照してください。

Windows インストーラー SQL 構文では、文字列リテラルでの単一引用符 (ASCII 値 39) のエスケープはサポートされていません。 ただし、レコードをフェッチまたは作成し、StringData プロパティまたは IntegerData プロパティを使用してフィールドを設定してから、Modify メソッドを呼び出すことができます。 または、レコードを作成し、Execute メソッドで説明されているパラメーター マーカー (?) を使用することができます。 これは、データベース関数 MsiViewExecuteMsiRecordSetIntegerMsiRecordSetString を使用して行うこともできます。

WHERE {operation-list} 句は、省略可能であり、選択範囲をフィルター処理するために使用される演算のグループです。 演算は、次の種類である必要があります。

  • {column} = {column}
  • {column} = | <> | > | < | >= | <= {constant}
  • {column} = | <> | > | < | >= | <= {marker}
  • {column} is null
  • {column} is not null

文字列値の場合は、= 演算または <> 演算のみが可能です。 オブジェクト値の比較は、IS NULL と IS NOT NULL に制限されています。

個々の演算は、AND 演算子または OR 演算子によってグループ化できます。 順序付けは、かっこ ( ) を使用して適用できます。

ORDER BY 句は、省略可能であり、並べ替え中に最初の遅延を発生させます。 文字列によって順序付けすると、同じ文字列がまとめてグループ化されますが、文字列がアルファベット順に並べられることはありません。

DISTINCT 句は、省略可能であり、返された結果セット内で同じレコードを繰り返しません。

{table-list} は、結合内で {table} として参照される 1 つ以上のテーブル名のコンマ区切りのリストです。

{column-list} は、選択された {column} として参照される 1 つ以上のテーブル列のコンマ区切りのリストです。 あいまいな列は、{tablename.column} としてさらに修飾できます。 SELECT クエリでは、参照されたテーブル内のすべての列を表す column-list としてアスタリスクを使用できます。 列の位置によってフィールドを参照する場合は、アスタリスクを使用するのではなく、名前によって列を選択します。 INSERT INTO クエリでは、column-list としてアスタリスクを使用することはできません。

SQL キーワードと競合するテーブル名と列名をエスケープするには、名前を 2 つのアクサン グラーブ記号 '' (ASCII 値 96) で囲みます。 {tablename.column} として修飾されている列名をエスケープする必要がある場合は、テーブルと列を {'tablename'.'column'} として個別にエスケープする必要があります。 予約語との競合を回避し、パフォーマンスを大幅に向上させるには、この方法ですべてのテーブル名と列名をエスケープすることをお勧めします。

テーブル名は 31 文字までに制限されています。 詳細については、「テーブル名」を参照してください。 テーブル名と列名では大文字と小文字が区別されます。 SQL キーワードでは大文字と小文字が区別されません。

SQL クエリの WHERE 句での式の最大数は、32 に制限されています。

内部結合のみがサポートされ、異なるテーブルからの列の比較によって指定されます。 循環結合はサポートされていません。 循環結合は、3 つ以上のテーブルをまとめて 1 つの循環としてリンクする SQL クエリです。 たとえば、次の例は循環結合です。

WHERE Table1.Field1=Table2.Field1 AND Table2.Field2=Table3.Field1 AND Table3.Field2=Table1.Field2.

最初にテーブルの主キーの一部である列を優先順に定義し、非主キー列がある場合はその後に定義する必要があります。 永続的な列は、一時列の前に定義する必要があります。 テキスト列の並べ替え順序は未定義です。ただし、同じテキスト値は常にまとめてグループ化されます。

列を追加または作成するときには、列の型を指定する必要があることに注意してください。

テーブルに 'object' 型の列を複数含めることはできません。

SQL クエリ内の文字列列に対して明示的に指定できる最大サイズは、255 です。 長さが無限である文字列列は、サイズ 0 として表されます。 詳細については、「列定義の形式」を参照してください。

SQL ステートメントを実行するには、ビューを作成する必要があります。 ただし、CREATE TABLE や INSERT INTO など、結果セットを作成しないビューは、MsiViewModify メソッドまたは Modify メソッドと共に使用して、ビューを通じてテーブルを更新することはできません。

バイナリ データが含まれているレコードを 1 つのデータベースからフェッチしてから、そのレコードを使用してデータをまったく異なるデータベースに挿入することはできないことに注意してください。 バイナリ データを 1 つのデータベースから別のデータベースに移動するには、クエリと MsiRecordSetStream 関数を通じて、データをファイルにエクスポートしてから、それを新しいデータベースにインポートする必要があります。 これにより、各データベースがバイナリ データの独自のコピーを持つようになります。