在我发布关于缺少相关文档的连接项目之前,有人会确认我不仅仅是在这里遗漏了什么吗?
在format
被列为字符串函数的文档页面上:
“所有内置的字符串函数都是确定性的。” -字符串函数 (Transact-SQL)
在相关页面上也没有提到format
不确定性:
但是,在尝试创建持久计算列时:
create table t (date_col date);
insert into t values (getdate());
alter table t add date_formatted_01 as format(date_col,'YYYY') persisted;
返回以下错误:
无法保留表“t”中的计算列“date_formatted_01”,因为该列是不确定的。
该文档指出
如果未提供 culture 参数,则使用当前会话的语言。
但添加文化论点并没有改变事情
这也失败了
alter table t add date_formatted_02 as format(date_col, 'd', 'en-US' ) persisted
rextester 演示:http ://rextester.com/ZMS22966
dbfiddle.uk 演示:http ://dbfiddle.uk/?rdbms=sqlserver_next&fiddle=7fc57d1916e901cb561b551af144aed6
该
FORMAT
文档现已更新(响应您的Connect 项目)说:同样,字符串函数 (Transact-SQL)现在包括:
函数不一定是确定性的或非确定性的。有些函数可以确定,具体取决于它们的使用方式:
CAST
就是这样CONVERT
的例子。根据您到目前为止所做的测试,我认为可以公平地说它FORMAT
并不总是确定性的,尽管它是一个字符串函数。如果您想知道它有时是否是确定性的,我能想到的唯一技术就是尝试足够多的不同方式来调用它,直到您满意为止。例如,让我们考虑FORMAT
应用于数字。只有十种不同的数字输入类型:似乎也只有九种不同的数字格式。可以尝试为所有可能的组合创建持久化列。下面是一些代码:
这是输出示例:
对于一些输入值和区域性,我无法将任何列添加到表中。我没有详尽尝试所有可能的区域性,因为我无法在 SQL Server 中找到它们的列表。
至少可以肯定地得出结论,关于 的确定性的文档
FORMAT
是不正确的,因此我建议为它提交一个连接项。我不是 sqlserver 的普通用户,所以我可能弄错了,但我的猜测是 format 不是字符串函数。根据文档:
https://learn.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql
format 采用日期类型或数字类型作为参数。如果你只想获取日期的年份部分,你不能使用年份函数吗?
如果你想要一个字符串表示: