有趣的问题,所以我做了一些挖掘,但没有得出任何结论:)
从...开始确定性和非确定性函数 https://msdn.microsoft.com/en-us/library/ms178091(v=sql.110).aspx
其中没有明确列出FORMAT
但指出:
所有聚合和字符串内置函数都是确定性的。
并链接到字符串函数 https://msdn.microsoft.com/en-us/library/ms181984(v=sql.110).aspx
再次,此页面指出
所有内置字符串函数都是确定性的。这意味着每当使用一组特定的输入值调用它们时,它们都会返回相同的值。
然而,的页面FORMAT https://msdn.microsoft.com/en-au/library/hh213505(v=sql.110).aspx对这个问题保持沉默。
FORMAT
使用 CLR并不排除它是确定性的 https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.server.sqlfunctionattribute.isdeterministic(v=vs.110).aspx但 doco 对实际执行情况却只字不提FORMAT
.
最后,怀疑这是 doco(或代码)中的错误快速搜索连接 https://connect.microsoft.com/SQLServer什么也没透露。
测试用例怎么样? (欢迎对此代码的有效性发表评论......)
CREATE FUNCTION WhatAmI(@Number INTEGER)
RETURNS NVARCHAR
WITH SCHEMABINDING
AS
BEGIN
RETURN FORMAT(@Number, 'd')
END
GO
SELECT OBJECTPROPERTY(OBJECT_ID('WhatAmI'),'IsDeterministic')
-----------
0
(1 row(s) affected)
Nup,这是不确定的。
所以,这是一个有趣的练习,但没有结论。
那么我们学到了什么(根据 BOL)?如果内置函数是不确定的,则无法使其如此。有些都取决于参数类型,有些应该是但事实并非如此。