= APPLY_FILTER(, ); ::= 存储 APPLY_FILTER 函数结果的变量。
::= | APPLY_FILTER 可用于持久表和表变量。
:: = 要过滤的表的名称。
::= : 要过滤的表变量的名称。
::= 要应用的过滤器命令。
备注 过滤器字符串 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;