您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

APPLY_FILTER

语法

 = APPLY_FILTER(, );

语法元素

 ::= 

存储 APPLY_FILTER 函数结果的变量。

 ::=  | 

APPLY_FILTER 可用于持久表和表变量。

 :: = 

要过滤的表的名称。

 ::= :

要过滤的表变量的名称。

 ::= 

要应用的过滤器命令。

备注 过滤器字符串 中不支持以下结构: 子查询,例如:CALL GET_PROCEDURE_NAME(' PROCEDURE_NAME in (SELECT object_name FROM SYS.OBJECTS), ?);完全限定的列名,例如:CALL GET_PROCEDURE_NAME(' PROCEDURE.PROCEDURE_NAME = 'DSO', ?);

描述

APPLY_FILTER 函数将动态过滤器应用于表或表变量。就逻辑而言,可将其视为部分动态 SQL 语句。函数的优势在于可以将其分配给表变量,并且不会阻止 SQL 内联。

注意 APPLY_FILTER 的缺点是缺少参数化功能。使用常量值始终会导致准备新的查询计划,并因此导致不同参数值的不同查询计划缓存条目。这伴随着查询准备花费的额外时间,以及快速变化的参数值场景中潜在的高速缓存淹没影响。为避免这种情况,我们建议使用带有 USING 子句的 EXEC 来利用参数化的 WHERE 子句。 示例代码之前:v_filter = :column || ' = ''' || :value || '''';lt = APPLY_FILTER(:lt0, :v_filter);示例代码之后:EXEC 'SELECT * FROM :lt0 WHERE (' || :column || ' = :value' INTO lt USING :lt0, :value READS SQL DATA;

示例

示例 1:对持久表应用过滤器

创建以下过程

CREATE PROCEDURE GET_PROCEDURE_NAME (IN iv_filter NVARCHAR(100), OUT procedures

outtype) AS

BEGIN

temp_procedures = APPLY_FILTER(SYS.PROCEDURES,:iv_filter);

procedures = SELECT SCHEMA_NAME, PROCEDURE_NAME FROM :temp_procedures;

END;

使用两个不同的过滤器变量调用过程。

CALL GET_PROCEDURE_NAME(' PROCEDURE_NAME like ''MYPROC%''', ?);

CALL GET_PROCEDURE_NAME(' SCHEMA_NAME = ''SYS''', ?);

示例 2:使用表变量

CREATE TYPE outtype AS TABLE (SCHEMA_NAME NVARCHAR(256), PROCEDURE_NAME NVARCHAR(256));

CREATE PROCEDURE GET_PROCEDURE_NAME (IN iv_filter NVARCHAR(100), OUT procedures outtype)

AS

BEGIN

temp_procedures = SELECT SCHEMA_NAME, PROCEDURE_NAME FROM SYS.PROCEDURES;

procedures = APPLY_FILTER(:temp_procedures,:iv_filter);

END;