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 查詢僅適用于非primary 索引鍵資料行。
將記錄新增至資料表 INSERT INTO {table} ({column-list}) VALUES ({constant-list}) [TEMPORARY]二進位資料無法使用 INSERT INTO 或 UPDATE SQL 查詢直接插入資料表。 如需詳細資訊,請參閱 使用 SQL 將二進位資料新增至資料表
新增資料表 新增資料表時,必須為每個資料行指定 CREATE TABLE {table} ( {column} {column type}) [HOLD]Column 類型。 至少必須指定一個主鍵資料行,才能建立新的資料表。 上述 {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 |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} 是一或多個常數的逗號分隔清單。

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.

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

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

資料表不能包含 'object' 類型的多個資料行。

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

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

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