Nat*_*ond 3 sql t-sql sql-server sql-server-2012
我有一系列常量函数来使编程和阅读我的一些 SQL 查询更容易。例如,
dbo.CONST_DogBreed(NVARCHAR(MAX))
将为INT
给定的狗品种返回一个。例如,dbo.CONST_DogBreed('Labrador')
可能返回12
。
我的问题是,如果我在查询中使用常量调用这个函数,它会重复评估它还是会意识到它是一个常量并且只评估一次?所以,如果我要这样做:
SELECT * FROM Dogs
WHERE [DogType] = dbo.CONST_DogBreed('Labrador')
Run Code Online (Sandbox Code Playgroud)
dbo.CONST_DogBreed('Labrador')
每次都要评估吗?我意识到这里的解决方案是在上面的变量中声明我想要的值,但如果没有必要,我宁愿不这样做。
即必须在每个查询的顶部执行此操作:
DECLARE @LabradorBreed INT = dbo.CONST_DogBreed('Labrador');
SELECT * FROM Dogs
WHERE [DogBreed] = @LabradorBreed
Run Code Online (Sandbox Code Playgroud)
在写这个问题时经过一些研究,似乎它可能基于函数是否是确定性的。如果是这样,我如何确保我的函数是确定性的?它会为我做吗?有几个 sql 问题指定了 Deterministic 和其他几个使用 Schema Binding 之类的东西。由于我的 const 函数不使用任何模式,我认为模式绑定是不必要的。
所以我想在这项研究之后归结为:我如何确保我的函数是确定性的?
数据库引擎会自动分析 Transact-SQL 函数的主体并评估该函数是否具有确定性。例如,如果该函数调用其他不确定的函数,或者如果该函数调用扩展存储过程,则数据库引擎将该函数标记为不确定的。对于公共语言运行时 (CLR) 函数,数据库引擎依赖于函数的作者使用 SqlFunction 自定义属性将函数标记为确定性或不具有确定性。
...
您需要将 WITH SCHEMABINDING 添加到用户定义函数的标题中,以使其适用于“确定性”标签。
https://technet.microsoft.com/en-us/library/ms187440(v=sql.105).aspx
归档时间: |
|
查看次数: |
342 次 |
最近记录: |