此功能引入了对参数化动态 SQL 的附加支持。可以使用标量变量,以及具有 USING 和 INTO 子句的 USING 和 INTO 子句以及 CALL-语句参数中的表变量。可以使用 INTO 和 USING 子句传入或传出标量或表格值。通过 INTO 子句指派给变量的结果集不会附加到过程结果遍历器中。
EXEC '' [INTO ] [USING ];
EXECUTE IMMEDIATE '' [INTO ] [USING ];
::= [{, } ...]
::=
::= [{, } ...]
EXEC 执行作为字符串参数传递的 SQL 语句 SELECT 语句,则 EXEC 不返回结果集。为此,您必须使用 EXECUTE IMMEDIATE。
如果查询返回结果集或输出参数,您可以使用 INTO 子句将值赋给标量或表变量。
当 SQL 语句是 SELECT 语句并且 INTO 子句中列出了表变量时,结果集会按顺序指派给表变量。如果在 SELECT 语句的 INTO 子句中列出了标量变量,则该变量的工作方式与
示例代码INTO 示例 1DO (IN tname NVARCHAR(10) => 'mytable')BEGIN DECLARE tv TABLE (i INT); EXEC 'select col1 * 10 as i from ' || :tname INTO tv; SELECT * FROM :tv;END; 示例代码INTO 示例 2DO (IN TNAME NVARCHAR(10) =>'mytable', IN CNAME1 NVARCHAR(10) => 'I', IN CNAME2 NVARCHAR(10) => 'A', OUT K INT =>?, OUT J INT => ?)BEGIN EXEC 'select max(' || :cname1 || ') as a, min(' ||:cname2 ||') as b from '|| :TNAME INTO K, J ;END; 示例代码INTO 示例 3CREATE PROCEDURE myproc (OUT i INT, OUT ot TABLE (i INT))AS BEGIN ...END; DO (OUT a INT => ?, OUT tv TABLE (i INT) => ?)BEGIN EXEC 'call myproc(:a, :tv)' INTO a, tv;END;
也可以使用 USING 子句绑定标量或表值。当 USING 子句中仅允许变量引用,并且具有相同名称的变量将绑定到参数 ':USING 子句中允许使用任何表达式,并且值按顺序映射到参数。当只有输入参数时,支持未命名参数绑定。
示例代码USING 示例 1DO BEGIN DECLARE tv TABLE (col1 INT) = SELECT * FROM mytab; DECLARE a INT = 123; DECLARE tv2 TABLE (col1 INT); EXEC 'select col1 + :a as col1 from :tv' INTO tv2 USING :a, :tv; SELECT * FROM :tv2;END; 示例代码USING 示例 2DO (IN TNAME NVARCHAR(10) =>'mytable', IN CNAME1 NVARCHAR(10) => 'I', IN CNAME2 NVARCHAR(10) => 'A', OUT K INT =>?, OUT J INT => ?)BEGIN DECLARE a INT = 2; DECLARE b INT = 3; EXEC 'select max(' || :cname1 || ') + ? * ? as a, min(' || :cname2 || ') as b from ' || :TNAME INTO K, J USING :a, :b;END; 示例代码USING 示例 3CREATE PROCEDURE myproc (IN i INT, IN itv TABLE (col1 INT))AS BEGIN ...END; DO BEGIN DECLARE tv TABLE (col1 INT) = SELECT * FROM mytab; DECLARE a INT = 123; EXEC 'call myproc(:a, :tv)' USING :a, :tv;END;
表变量不能同时在 INTO 子句和 USING 子句中使用。
参数 '?'仅适用于标量输入参数。
参数 '?'和变量引用 ':