我可以使 SQL Server FORMAT 具有确定性吗?

2024-04-20

我想制作一个返回整数形式的 UDFYYYYMM这样我就可以轻松地按月划分一些东西。我试图将此函数分配给 a 的值PERSISTED计算列。

我目前有以下内容,效果很好:

CREATE FUNCTION dbo.GetYearMonth(@pDate DATETIME2)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @fYear VARCHAR(4) = RIGHT('0000' + CAST(YEAR(@pDate) AS VARCHAR),4)
    DECLARE @fMonth VARCHAR(2) = RIGHT('00' + CAST(MONTH(@pDate) AS VARCHAR),2)

    RETURN CAST(@fYear + @fMonth AS INT)
END

但我认为使用起来更干净FORMAT反而。我试过这个:

CREATE FUNCTION dbo.GetYearMonth(@pDate DATETIME2)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @fYear VARCHAR(4) = FORMAT(@pDate,'yyyy', 'en-us')
    DECLARE @fMonth VARCHAR(2) = FORMAT(@pDate,'MM', 'en-us')

    RETURN CAST(@fYear + @fMonth AS INT)
END

但这个函数是不确定的。 有没有办法制作FORMAT确定性的?或者是否有更好的方法来做到这一点,使 UDF 具有确定性?


有趣的问题,所以我做了一些挖掘,但没有得出任何结论:)

从...开始确定性和非确定性函数 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)?如果内置函数是不确定的,则无法使其如此。有些都取决于参数类型,有些应该是但事实并非如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使 SQL Server FORMAT 具有确定性吗? 的相关文章

随机推荐

  • 为什么这个简单的 C# 试用不起作用 [重复]

    这个问题在这里已经有答案了 这会产生条纹而不是点 为什么 我正在尝试绘制单个像素 还尝试了另一种方法 使用 fillrectangle 它也没有给出所需的结果 得到的是条形而不是点 protected override void OnPai
  • 如何在异步代码中处理 CPU 密集型任务

    我正在做一些需要异步方法的繁重处理 我的一个方法返回一个字典列表 在将其添加到另一个可等待对象之前需要对其进行大量处理 IE def cpu bound task here record some complicated preproces
  • ExoPlayer - 奇怪的阿拉伯语/波斯语字幕格式

    我正在尝试创建一个带字幕的视频播放器 除了一件事之外 一切都已设置并正常工作 我的阿拉伯语字幕没有正确显示 它们的符号和东西看起来很奇怪 像这样 这是我的带有字幕的 ExoPlayer 设置 Uri srt Uri parse http d
  • Exchange Web 服务:UseDefaultCredentials 属性

    这个微软页面 http msdn microsoft com en us library exchange ff597939 28v exchg 80 29 aspx表示通过将 UseDefaultCredentials 属性设置为 tru
  • 为方法创建 IObservable 的好方法是什么?

    比方说 我们有一堂课 public class Foo public string Do int param 我想创建一个可观察的值 这些值是由Do方法 一种方法是创建一个正在调用的事件Do并使用Observable FromEvent创建
  • 如何使用 Spring 注入键值属性文件?

    我有一个键值属性文件 其中包含错误代码及其错误消息 我想在应用程序启动时注入此文件 以便我可以在注入的属性上进行查找 而无需读取该文件 下面只是伪代码 里面有什么吗Spring可以创建这个设置吗 Value location classpa
  • 如何解决 AutoMapper 错误? (堆栈溢出异常!)

    我在用自动映射器 http automapper codeplex com EF 实体 gt POCO 用于以下类 public class Category public int CategoryID get set public str
  • 如何避免 fread() 将日期信息导入为 IDate?

    我最初编写了一个脚本 该脚本通过约 70k 次迭代进行计算 我使用 rbind 将结果 缝合 在一起 1 次迭代可能会产生 0 到多行的结果 所以我不认为预先分配输出会使感觉 为了加快速度 我将其分成 4 个单独的脚本 每个脚本在单独的会话
  • 为什么 wm_concat 在这里不起作用?

    我有这个查询 SELECT OBJECT ID from cr object group entries vw where object group id IN SELECT ITEM FROM TABLE CR FN SPLIT STRI
  • Java Swing 取消无限循环

    我在 Swing 中遇到了无限循环问题 做了一些研究并遇到了 SwingWorker 线程 但不太确定如何实现它们 我已经拼凑了一个简单的程序来显示问题 一个按钮启动无限循环 我希望另一个按钮停止它 但当然 由于 Swing 单线程问题 另
  • 选择一个元素及其所有后代元素

    选择一个元素and它的所有后代元素 media media color f00 我是否只能使用一个选择器 而不是用逗号分隔两个选择器 我正在寻找一种更有效的方式来输入此内容 With XPath https www w3schools co
  • Swing 中带有小字体的字符串的边界

    关于计算应绘制到 Swing 组件中的字符串的大小 宽度或高度 存在许多 许多 问题 并且提出了许多解决方案 然而 我注意到这些解决方案中的大多数都not对于小字体可以正常工作 下面是一个MCVE https stackoverflow c
  • 如何在 Winforms 中将枚举转换为布尔值以进行数据绑定?

    是否有可能做到这一点 我需要使用 this ControlName DataBindings Add 所以我除了绑定我之外无法定义逻辑enum值对一个bool 例如 DataClass Data Type enum EDIT 我需要绑定Da
  • WordPress 403/404 错误:您无权访问此服务器上的 /wp-admin/themes.php

    一些背景 这周我建立了六个博客 全部使用 Wordpress 2 92 通过 Hostgator 与 Fantastico 一起安装在婴儿鳄鱼计划上 我为每个博客使用相同的主题 热图 2 5 4 和插件 他们都已启动并运行 没有任何问题 今
  • 如何在 Swing 中使 JCheckBox 成为只读?

    我想要一列复选框指示持久程序的步骤 在这种情况下 用户不应更改复选框 它们由后台进程更改 不幸的是 如果我打电话setEnable false 我使复选框不仅只读 而且变暗 如何实现 从复选框中删除 MouseListener 和 Key
  • AngularJS 显示或隐藏表单元素的方式是什么?

    这个问题是 Tami Wright 在邮件列表中提出的 我正从 JQuery 进入 AngularJS 世界 但不太确定如何翻译特定的用例 这在 JQuery 中是不费吹灰之力的 该用例是根据同一表单中选择元素的更改来启用 禁用或隐藏 显示
  • Directory.GetCurrentDirectory() 在 Linux 上不起作用?

    因此 我尝试创建一个需要读取名为 scripts 的子文件夹中的脚本的应用程序 我的代码有问题 string script Console ReadLine string path Directory GetCurrentDirectory
  • 为什么 Django 模型信号不起作用?

    我正在尝试根据用户的状态创建用户的活动流 models class Status models Model body models TextField max length 200 image models ImageField blank
  • android.permission.REMOVE_TASKS :权限被拒绝

    我想删除最近的任务列表 通过谷歌搜索 我找到了一些来自 stackoverflow 的链接 但他们都没有得到适当的答复 只有一个链接 Android 如何清除大多数手机中可以通过Home按钮获取的最近任务列表 反思是一种可能的方式吗 htt
  • 我可以使 SQL Server FORMAT 具有确定性吗?

    我想制作一个返回整数形式的 UDFYYYYMM这样我就可以轻松地按月划分一些东西 我试图将此函数分配给 a 的值PERSISTED计算列 我目前有以下内容 效果很好 CREATE FUNCTION dbo GetYearMonth pDat