确定性属性在 UDF 中未按预期工作

问题描述 投票:0回答:1

我正在创建一个 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
,新值。

我有一个类似的函数,它查询一个巨大的表并返回一组值(以逗号分隔的字符串)。我的期望是避免每次使用相同的输入调用整个函数时执行整个函数。

sql-server azure-sql-database user-defined-functions deterministic
1个回答
0
投票

您可以使用结果集缓存 在 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;
© www.soinside.com 2019 - 2024. All rights reserved.