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) 。 不過,您可以擷取或建立記錄、使用 StringData 或 IntegerData 屬性設定欄位,然後呼叫 Modify 方法。 或者,您也可以建立記錄,並使用 Execute 方法中所述的參數標記 (?) 。 您也可以使用資料庫函式 MsiViewExecute、 MsiRecordSetInteger和 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} 之一或多個資料表名稱的逗號分隔清單。
{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,無法與 MsiViewModify 或 Modify 方法搭配使用,以透過檢視更新資料表。
請注意,您無法從一個資料庫擷取包含二進位資料的記錄,然後使用該記錄將資料插入完全不同的資料庫中。 若要將二進位資料從某個資料庫移到另一個資料庫,您應該將資料匯出至檔案,然後透過查詢和 MsiRecordSetStream 函式將其匯入至新的資料庫。 這可確保每個資料庫都有自己的二進位資料複本。