.net – 如何在SQL Server 2012中的SQLCLR程序集中使用TimeZoneI
我想在SQL Server 2012中实现时区转换.但是,TimeZoneInfo标有MayLeakOnAbort属性.当调用我定义的SQL函数(使用TimeZoneInfo)时,这会导致运行时错误.
该错误报告如下
文档提示我可以使用“SafeHandle”来解决这个泄漏问题,但我不知道如何. 那么,如何在SQLCLR上下文中使用类TimeZoneInfo? 跟进: 我在网站上找到了another question,尽管它处理的是SQL 2005,但它规定了一个与2012一起使用的动作.但是,这个解决方案的某些方面并不令人满意. 解决方法更新的答案我在原始答案which you can find here中编写了我所说的实用工具. 此外,从SQL Server 2016(和Azure SQL数据库)开始,您现在可以使用AT TIME ZONE关键字在时区之间进行转换. 原始答案 不幸的是,在SQL Server中使用时区没有很好的解决方案. 我严重调查了您链接的问题,以及this one.没有内置时区功能,在SQLCLR中使用TimeZoneInfo需要将程序集注册为“不安全”.这通常是不希望的. 我还使用SQLCLR的Noda Time进行了调查.您可以在this issue中阅读它.由于某些项目在内部缓存的方式,它也必须注册为“不安全”. 最终,对于任何一个项目,问题是无法在SQLCLR中缓存任何内容.您不能以线程安全的方式使用静态变量,并且您不能执行任何线程同步或使用ConcurrentDictionary之类的类. SQL希望完全控制程序集的线程模型.只有单线程使用 – 一次性丢弃样式代码才能在“安全”程序集中运行.我在这个问题中深入研究了这一点:Multithreaded caching in SQL CLR 希望最终会有一个可以在SQLCLR中运行的Noda Time构建,但它将是一个不进行任何缓存的特殊构建.因此它不会表现得那么快,但它会在保持安全的同时完成工作. TimeZoneInfo不太可能改变.因此,除非SQL Server团队将时区功能直接引入SQL Server(如Oracle和Postgres一样),否则您只有几个选项: >不要在数据层中尝试时区转换.使用UTC中的datetime或datetime2值,或将datetimeoffset值与任何偏移量一起使用.但是在应用程序层中的时区之间进行所有转换.这是我现在最好的建议. 我正在考虑的另一个想法是编写一个专门用于SQL Server的IANA/Olson TZDB解析器和函数.这与上面的选项2类似,但是以可维护的方式完成,并且使用IANA标准数据而不是Windows时区.也许有一天我会接受这个,或者有人会打败我.同样,我不知道有任何当前的项目,但如果有人知道,请在评论中告诉我. (完成 – 见顶部更新) 关于SWITCHOFFSET – 只有在您已经知道目标偏移时才有效.这是成功的一半,也许可能是为什么微软仍然将datetimeoffset标记为the docs中的“夏令时”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 今天SQLServer2000突然不能启动了
- SQLSERVER的查询结果复制到EXCEL带标题行
- SQLServer2005?NVARCHAR?和VARCHAR区别和使用
- sql-server – Varchar(max)字段,在8000个字符后
- 由于一个或多个对象访问此列,ALTER TABLE DROP C
- sql-server – 在SQL Server中配置见证服务器以进
- Redis中实现查找某个值的范围
- sql-server – SQL Server数据工具和Visual Stud
- SQL Server Native Client下载 SQL Server Nativ
- entity-framework – 可能让DbContext忽略数据库