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)。 但是,你可以提取或创建记录,使用 StringData 或 IntegerData 属性设置字段,然后调用 Modify 方法。 或者,可以创建一条记录并使用 Execute 方法中描述的参数标记 (?)。 还可以使用数据库函数 MsiViewExecute、MsiRecordSetInteger 和 MsiRecordSetString。
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)不能与 MsiViewModify 或 Modify 方法一起用来通过视图更新表。
请注意,不能从一个数据库中提取包含二进制数据的记录,然后使用该记录将数据插入到完全不同的数据库中。 若要将二进制数据从一个数据库移动到另一个数据库,应该将数据导出到一个文件,然后通过查询和 MsiRecordSetStream 函数将其导入到新数据库中。 这可以确保每个数据库都有自身的二进制数据副本。