

# 使用参数化查询
<a name="querying-with-prepared-statements"></a>

您可以使用 Athena 参数化查询在执行时使用不同的参数值重新运行同一个查询，从而帮助防止 SQL 注入攻击。在 Athena 中，参数化查询可以在任何 DML 查询或 SQL 预准备语句中采用执行参数的形式。
+ 带有执行参数的查询可以在单个步骤中完成，而不是特定于工作组。您可以在任何 DML 查询中为要参数化的值放置问号。运行查询时，按顺序声明执行参数的值。参数的声明和参数的赋值可以在同一查询中完成，但单独进行。与预准备语句不同，您可以在提交带有执行参数的查询时选择工作组。
+ 预准备语句需要两个单独的 SQL 语句：`PREPARE` 和 `EXECUTE`。首先，在 `PREPARE` 语句中定义参数。然后，运行为您定义的参数提供值的 `EXECUTE` 语句。预准备语句特定于工作组；您不能在预准备语句所属的工作组的上下文以外运行它们。

## 注意事项和限制
<a name="querying-with-prepared-statements-considerations-and-limitations"></a>
+ 参数化查询仅在 Athena 引擎版本 2 及更高版本中受支持。有关 Athena 引擎版本的更多信息，请参阅 [Athena 引擎版本控制](engine-versions.md)。
+ 目前，参数化查询仅在 `SELECT`、`INSERT INTO`、`CTAS` 和 `UNLOAD` 语句中受支持。
+ 在参数化查询中，参数是位置参数，并用 `?` 指示。参数按其在查询中的顺序赋值。命名参数不受支持。
+ 目前，`?` 参数只能放在 `WHERE` 子句中。不支持 `SELECT ? FROM table` 之类的语法。
+ 问号参数不能放在双引号或单引号以内（即 `'?'` 和 `"?"` 不是有效的语法）。
+ 要将 SQL 执行参数视为字符串，它们必须用单引号而不是双引号括起来。
+ 如有必要，您可以在为参数化术语输入值时使用 `CAST` 函数。例如，如果您有一列 `date` 类型在查询中参数化，并且想要查询日期 `2014-07-05`，则为参数值输入 `CAST('2014-07-05' AS DATE)` 将返回结果。
+ 预准备语句特定于工作组，预准备语句名称在工作组中必须唯一。
+ 预准备语句的 IAM 权限是必需的。有关更多信息，请参阅 [配置对于预编译语句的访问](security-iam-athena-prepared-statements.md)。
+ 在 Athena 控制台中使用执行参数的查询最多只能有 25 个问号。

**Topics**
+ [注意事项和限制](#querying-with-prepared-statements-considerations-and-limitations)
+ [使用执行参数](querying-with-prepared-statements-querying-using-execution-parameters.md)
+ [使用预准备语句](querying-with-prepared-statements-querying.md)
+ [其他资源](querying-with-prepared-statements-additional-resources.md)