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 [, 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} is null
  • {column} is not 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 函数将其导入到新数据库中。 这可以确保每个数据库都有自身的二进制数据副本。