绑定变量¶
应用程序可以接受来自用户的数据,并在 SQL 语句中使用该数据。例如,应用程序可能会要求用户输入联系信息,例如地址和电话号码。
要在 SQL 语句中指定此用户输入,您可以以编程方式构造一个字符串来表示该 SQL 语句,方法是将用户输入与其他语句部分拼接起来。或者,您可以使用 绑定变量。要绑定变量,请在 SQL 语句文本中放置一个或多个占位符,然后为每个占位符指定变量(要使用的值)。绑定变量可以在构造带有用户输入的 SQL 语句时防止 SQL 注入攻击。
您可以通过以下方式在 Snowflake 中使用绑定变量:
调用 Snowflake 驱动程序 支持的 APIs
使用 Snowflake Scripting 编写的过程代码
使用 Snowflake SQL REST API 的应用程序
概述¶
使用绑定变量,您可以将 SQL 语句中的字面量替换为占位符。例如,以下 SQL 语句对插入的值使用字面量:
INSERT INTO t (c1, c2) VALUES (1, 'Test string');
以下 SQL 语句对插入的值使用占位符:
INSERT INTO t (c1, c2) VALUES (?, ?);
您的应用程序代码将数据与 SQL 语句中的每个占位符绑定在一起。使用占位符绑定数据的技术取决于编程语言。占位符的语法也因编程语言而异。它是 ?
, :<varname>
,或是 %<varname>
。
将绑定变量与驱动程序一起使用¶
使用 Snowflake 驱动程序,您可以编写在 Snowflake 上执行操作的应用程序。驱动程序支持 Go、Java 和 Python 等编程语言。有关在应用程序中为特定驱动程序使用绑定变量的信息,请按照驱动程序的链接进行操作:
Go (https://pkg.go.dev/github.com/snowflakedb/gosnowflake#hdr-Binding_Parameters)
`.NET<https://github.com/snowflakedb/snowflake-connector-net#bind-parameter>`__
备注
PHP 驱动程序不支持绑定变量。
在 Snowflake Scripting 中使用绑定变量¶
您可以使用 Snowflake Scripting 来创建执行 SQL 的过程代码,例如代码块和存储过程。请在变量名称前面加上冒号。例如,以下 INSERT 语句指定名为 variable1
的绑定变量:
INSERT INTO t (c1) VALUES (:variable1)
有关在 Snowflake Scripting 中使用绑定变量的信息,请参阅 在 SQL 语句中使用变量(绑定)。
将绑定变量与 SQL API 结合使用¶
您可以使用 Snowflake SQL REST API 访问和更新 Snowflake 数据库中的数据。您可以创建使用 SQL API 的应用程序,以提交 SQL 语句并管理部署。
当您提交执行 SQL 语句的请求时,您可以对语句中的值使用绑定变量。有关更多信息,请参阅 在语句中使用绑定变量。
将值数组绑定到变量¶
您可以将值数组绑定到 SQL 语句中的变量。使用此技术,您可以通过在单个批处理中插入多行来提高性能,从而避免网络往返和编译。数组绑定的使用也称为“批量插入”。
备注
Snowflake 支持建议使用的其他数据加载方法,而不是使用数组绑定。有关更多信息,请参阅 将数据载入 Snowflake 和 数据加载和卸载命令。
以下是 Python 代码中的数组绑定示例:
conn = snowflake.connector.connect( ... ) rows_to_insert = [('milk', 2), ('apple', 3), ('egg', 2)] conn.cursor().executemany( "insert into grocery (item, quantity) values (?, ?)", rows_to_insert)
此示例指定以下绑定列表:[('milk', 2), ('apple', 3), ('egg', 2)]
。应用程序指定绑定列表的方式取决于编程语言。
此代码在表中插入三行:
+-------+----+ | C1 | C2 | |-------+----| | milk | 2 | | apple | 3 | | egg | 2 | +-------+----+
有关在应用程序中为特定驱动程序使用数组绑定的信息,请按照驱动程序的链接进行操作:
Go (https://pkg.go.dev/github.com/snowflakedb/gosnowflake#hdr-Batch_Inserts_and_Binding_Parameters)
`.NET<https://github.com/snowflakedb/snowflake-connector-net#bind-array-variables>`__
备注
PHP 驱动程序不支持数组绑定。
数组绑定的限制¶
以下限制适用于数组绑定:
仅 INSERT INTO ...VALUES 语句可以包含数组绑定变量。
VALUES 子句必须是绑定变量的单行列表。例如,不允许出现以下 VALUES 子句:
VALUES (?,?), (?,?)
在不使用数组绑定的情况下插入多行¶
INSERT 语句可能会使用绑定变量插入多行,而不使用数组绑定。以下示例将值插入到两行中,但它不使用数组绑定。
INSERT INTO t VALUES (?,?), (?,?);
应用程序可以按顺序为占位符指定一个绑定列表,该列表相当于以下值:[1,'String1',2,'String2']
。因为 VALUES 子句指定多行时,语句仅插入确切的值数(在示例中为 4 个),而不是动态数量的行。
将绑定变量与半结构化数据结合使用¶
要将绑定变量与半结构化数据结合使用,请将变量绑定为字符串类型,并使用 PARSE_JSON 或 ARRAY_CONSTRUCT 等函数。
以下示例创建包含一个 VARIANT 列的表,然后调用 PARSE_JSON 函数将半结构化数据插入到带有绑定变量的表中:
CREATE TABLE t (a VARIANT); -- Code that supplies a bind value for ? of '{'a': 'abc', 'x': 'xyz'}' INSERT INTO t SELECT PARSE_JSON(a) FROM VALUES (?);
以下示例查询该表:
SELECT * FROM t;
该查询会返回以下输出:
+---------------+ | A | |---------------| | { | | "a": "abc", | | "x": "xyz" | | } | +---------------+
以下语句调用 ARRAY_CONSTRUCT 函数将半结构化数据数组插入到带有绑定变量的 VARIANT 列中:
INSERT INTO t SELECT ARRAY_CONSTRUCT(column1) FROM VALUES (?);
这两个示例都可以插入单行,也可以使用数组绑定在一个批处理中插入多行。您可以使用此技术插入 VARIANT 列中有效的任何类型的半结构化数据。