次の方法で共有


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 クエリは、非primary キー列でのみ機能します。
テーブルにレコードを追加する 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 列 [, 列][, ...].
テーブルを削除する 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メソッド」で説明されているパラメーター マーカー (?)使用することもできます。 これは、MsiViewExecuteMsiRecordSetInteger、および msiRecordSetStringデータベース関数を使用して行うこともできます。

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

  • {column} = {column}
  • {column} = |<> |> |< |>= |<= {constant}
  • {column} = |<> |> |< |>= |<= {marker}
  • {column} が null です
  • {column} が null ではありません

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

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

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

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

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

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

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

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

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

内部結合のみがサポートされ、異なるテーブルの列の比較によって指定されます。 循環結合はサポートされていません。 循環結合は、3 つ以上のテーブルを回線にリンクする 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 つのデータベースからフェッチしてから、そのレコードを使用してまったく異なるデータベースにデータを挿入することはできません。 バイナリ データをあるデータベースから別のデータベースに移動するには、データをファイルにエクスポートし、クエリと MsiRecordSetStream 関数を使用して新しいデータベースにインポートする必要があります。 これにより、各データベースにバイナリ データの独自のコピーが確実に含まれます。