共用方式為


SQL 語法

Windows Installer 的 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]數據行類型必須在加入數據表時為每個數據行指定。 至少必須指定一個主鍵數據行,才能建立新的數據表。 上述 {column type} 的可能替代專案如下:CHAR [({size} )] |CHARACTER [( {size} )] |LONGCHAR |SHORT |INT |INTEGER |LONG |OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [, column...][, ...]PRIMARY KEY 數據行 [, column][, ...]。
拿掉資料表 DROP TABLE {table}
新增數據行 ALTER TABLE {table} ADD {column} {column type}新增數據行時必須指定數據行類型。 上述 {column type} 的可能替代專案如下:CHAR [({size} )] |CHARACTER [( {size} )] |LONGCHAR |SHORT |INT |INTEGER |LONG |物件 [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} 是一或多個常數的逗號分隔列表。

LOCALIZABLE 選項會設定資料行屬性,指出數據行必須當地語系化。

{column} 是數據表字段中值的單欄參考。

{marker} 是查詢所提交記錄所提供值的參數參考。 它以問號 ?表示在 SQL 語句中。 如需參數使用的相關信息,請參閱 MsiViewExecute 函式或 Execute 方法。

Windows Installer SQL 語法不支援字串常值中逸出單引號 (ASCII 值 39)。 不過,您可以擷取或建立記錄、使用 StringDataIntegerData 屬性來設定字段,然後呼叫 Modify 方法。 或者,您也可以建立記錄,並使用 execute 方法中所述的參數標記(?)。 您也可以使用 MsiViewExecuteMsiRecordSetIntegerMsiRecordSetString來執行此動作。

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}。

{column-list} 是一個或多個數據表數據行的逗號分隔列表,稱為 {column} 。 模棱兩可的數據行可能進一步限定為 {tablename.column}。 星號可用來做為 SELECT 查詢中的數據行清單,以代表參考資料表中的所有數據行。 依數據行位置參考欄位時,請依名稱選取資料行,而不是使用星號。 星號不能當做 INSERT INTO 查詢中的數據行清單使用。

若要逸出與 SQL 關鍵詞衝突的數據表名稱和數據行名稱,請將名稱括在兩個嚴重強調符號 '' 之間(ASCII 值 96)。 如果數據行名稱必須逸出且限定為 {tablename.column},則必須將數據表和數據行個別逸出為 {'tablename'.'column'}。 建議您以這種方式逸出所有數據表名稱和數據行名稱,以避免與保留字發生衝突,並取得顯著的效能。

數據表名稱限制為31個字元。 如需詳細資訊,請參閱 資料表名稱。 數據表和數據行名稱會區分大小寫。 SQL 關鍵詞不區分大小寫。

SQL 查詢 WHERE 子句中的表達式數目上限限製為 32。

僅支援內部聯結,並由不同數據表的數據行比較來指定。 不支援循環聯結。 迴圈聯結是一個 SQL 查詢,可將三個或多個數據表連結至線路。 例如,以下是循環聯結:

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

屬於數據表主鍵(s)的數據行必須先以優先順序定義,後面接著任何非主鍵數據行。 持續性數據行必須在暫存數據行之前定義。 未定義文字數據行的排序順序;不過,相同的文字值一律會群組在一起。

請注意,新增或建立資料行時,您必須指定資料行類型。

數據表不能包含一個以上的類型 『object』 資料行。

SQL 查詢中字串數據行可以明確指定的大小上限為 255。 無限長度的字串數據行會以大小 0 表示。 如需詳細資訊,請參閱 資料行定義格式

若要執行任何 SQL 語句,必須建立檢視。 不過,不會建立結果集的檢視,例如 CREATE TABLE 或 INSERT INTO,無法與 MsiViewModifyModify 方法搭配使用,以透過檢視更新數據表。

請注意,您無法從一個資料庫擷取包含二進位數據的記錄,然後使用該記錄將數據插入完全不同的資料庫中。 若要將二進位數據從某個資料庫移至另一個資料庫,您應該將數據匯出至檔案,然後透過查詢和 MsiRecordSetStream 函式將其匯入新資料庫。 這可確保每個資料庫都有自己的二進位數據複本。