我正在创建一个 UDF,希望具有确定性,即对于相同的输入,它应该给出相同的结果。但当表格更新时,它没有按预期工作。
步骤#1。创建一个表并插入几条记录。
CREATE TABLE dbo.determin_function_test_table
(
empid int,
ename varchar(100),
dob date
);
INSERT dbo.determin_function_test_table(empid, ename, dob)
VALUES (101,'Arun','1990-01-01'),(102,'Bala','1990-02-02'),(103,'Chitra','1990-03-03');
步骤#2。创建确定性函数(使用 SCHEMABINDING)
CREATE OR ALTER FUNCTION dbo.determin_function_test_udf
(
@p_empid int
)
RETURNS varchar(100)
WITH SCHEMABINDING
AS
BEGIN
RETURN (SELECT ename FROM dbo.determin_function_test_table WHERE empid = @p_empid);
END
GO
步骤#3。选择功能。 INFORMATION_SCHEMA 的结果和确定性属性良好。
select *
from INFORMATION_SCHEMA.ROUTINES
where specific_name = 'determin_function_test_udf'
and is_deterministic = 'YES';
select dbo.determin_function_test_udf(101) as emp_name;
select dbo.determin_function_test_udf(102) as emp_name;
select dbo.determin_function_test_udf(103) as emp_name;
第 4 步.更新记录。
update dbo.determin_function_test_table
set ename = 'Chitra Dhana'
where empid = 103;
第 5 步。为此调用 UDF
empid
。
select dbo.determin_function_test_udf(103) as emp_name;
现在预期结果是
Chitra
,即旧值。但该函数返回 Chitra Dhana
,新值。
我有一个类似的函数,它查询一个巨大的表并返回一组值(以逗号分隔的字符串)。我的期望是避免每次使用相同的输入调用整个函数时执行整个函数。
您可以使用结果集缓存 在 azure sql 数据库中。
ALTER DATABASE [database_name]
SET RESULT_SET_CACHING ON;
在以下条件下使用缓存结果。
- 运行查询的用户可以访问查询中引用的所有表。
- 新查询与生成结果集缓存的上一个查询之间存在完全匹配。
- 生成缓存结果集的表中没有数据或架构更改。
您检查表
result_cache_hit
中的 sys.dm_pdw_exec_requests
列,了解查询是否使用缓存结果 (1) 或未使用缓存结果 (0)。
您也可以使用以下命令将其设置为会话级别。
SET RESULT_SET_CACHING ON;