

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用參數化查詢
<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)