语句参数

参数是 SQL 语句中的变量。 例如,假设部件表包含名为 PartID、Description 和 Price 的列。 若要添加不带参数的部件,需要构造 SQL 语句,例如:

INSERT INTO Parts (PartID, Description, Price) VALUES (2100, 'Drive shaft', 50.00)  

尽管此语句插入了新订单,但对于订单条目应用程序来说,这不是一个很好的解决方案,因为插入的值不能在应用程序中进行硬编码。 替代方法是使用要插入的值在运行时构造 SQL 语句。 这也不是一个很好的解决方案,因为运行时构造语句非常复杂。 最佳解决方案是将 VALUES 子句的元素替换为问号 (?),或参数标记

INSERT INTO Parts (PartID, Description, Price) VALUES (?, ?, ?)  

参数标记然后被绑定到应用程序变量。 若要添加新行,应用程序只需设置变量的值并执行此语句。 然后,驱动程序检索变量的当前值并将其发送至数据源。 如果将多次执行此语句,则应用程序可通过准备此语句使该进程更有效。

刚刚显示的语句可能在订单条目应用程序中硬编码以插入新行。 但是,参数标记不限于纵向应用程序。 所有应用程序均通过避免转换到文本和从文本转换来简化在运行时构造 SQL 语句的难度。 例如,刚刚显示的部件 ID 很可能以整数的形式存储在应用程序中。 如果 SQL 语句在没有参数标记的情况下构造,则应用程序必须将部件 ID 转换为文本,并且数据源必须将其转换回整数。 通过使用参数标记,应用程序可以将部件 ID 作为整数发送到驱动程序,通常可将其作为整数发送到数据源。 这会保存两次转换。 对于长数据值,这非常重要,因为此类值的文本形式经常超过 SQL 语句的允许长度。

参数仅在 SQL 语句的某些位置有效。 例如,参数不允许在 select 列表(SELECT 语句返回的列列表)中,也不允许作为二元运算符(如等号 [=])的两个操作数,因为无法确定参数类型。 通常,参数仅在数据操作语言 (DML) 语句中有效,而不是在数据定义语言 (DDL) 语句中有效。 有关详细信息,请参阅“附录 C:SQL 语法”中的参数标记

当 SQL 语句调用程序时,可以使用命名参数。 命名参数由名称标识,而不是由其在 SQL 语句中的位置标识。 命名参数可以通过调用 SQLBindParameter 绑定,但参数由 IPD(实现参数描述符)的 SQL_DESC_NAME 字段标识,而不是由 SQLBindParameter 的 ParameterNumber 自变量标识。 还可以通过调用 SQLSetDescField 或 SQLSetDescRec 来绑定。 有关命名参数的详细信息,请参阅本节后面的按名称绑定参数(命名参数)。 有关描述符的详细信息,请参阅描述符

本部分包含以下主题。