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 |对象 [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)。 但是,可以提取或创建记录,使用 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 函数将其导入新数据库。 这可确保每个数据库都有自己的二进制数据副本。