【问题标题】:DateTime.TryParse uses wrong format for MSADateTime.TryParse 使用错误的 MSA 格式
【发布时间】:2018-06-18 10:45:11
【问题描述】:

包含 DateTime.TryParse 的 c# sqlclr 函数未在新的 Windows 服务器上返回正确的日期。此服务器上的日期和区域设置采用美国格式而不是 GB,并且 sql 服务器正在使用托管服务帐户。

我安装了英语(英国)语言包并删除了旧的。更新了英国日期格式的区域设置,并使用控制面板区域设置中的管理选项卡将设置复制到欢迎屏幕、系统帐户和新用户。

英国日期解析仍然不起作用。在我的用户帐户下的 powershell 中手动调用该函数会返回正确的值。

我尝试根据此列表更改 MSA 帐户下的注册表设置以匹配我当前的用户,但仍然没有成功。 https://blogs.technet.microsoft.com/askperf/2012/08/16/how-to-change-regional-settings-for-all-users-on-a-computer/

Windows Server 2016 内部版本 14393 上的 SQL Server 2017 (RTM-CU6)

【问题讨论】:

    标签: sql-server datetime c#-3.0 sqlclr regional-settings


    【解决方案1】:

    要更新托管服务帐户的区域设置(无需重新创建),请执行以下操作。

    1. 使用来自 sysinternals 的 psexec 运行 powershell。将密码留空,然后按 Enter。 cmd 也可以,但 powershell 可以让您轻松测试该功能。

      & 'psexec.exe' -u 域\msa$ -i powershell

    2. 添加 dll 并检查函数结果。

      添加类型-路径“路径\clr.dll”
      [TypeConverter]::ftn_ConvertToDate("20/10/2017 00:00");

    3. 返回的结果不正确。在 powershell 中运行intl.cpl。这将以 msa 用户身份打开区域设置。根据需要将格式设置为英语(英国)或其他格式。这将更改为其运行 powershell 会话的 MSA 的设置。

    4. 再次测试以查看正确的结果。

      [TypeConverter]::ftn_ConvertToDate("20/10/2017 00:00");

    5. 重启 SQL 服务,clr 函数将使用新的日期格式。

    【讨论】:

    • 您好。感谢您发布此信息 (+1)。 #3应该有更多的解释吗?我对 PowerShell 做的不多,也不完全确定在哪里可以找到 intl.cpl 等。也许发布要为该步骤执行的命令?另外,快速提问:如果您使用的是 SQL Server 2017,为什么不使用内置的 T-SQL TRY_PARSE 函数?它确实使用相同的底层 .NET 方法。
    • 是的,我会详细说明。只是想趁我有时间把它弄进去。收到函数后我也想到了同样的事情,但 sqlclr 的执行速度明显更快。我猜这是因为它对 3 个日期进行了 3 次 try_parse 调用,并且将其编译为 1 比 3 次单独转换为 clr 更好。尚未证明这一点,但看到差异非常有趣。
    • 我假设您已将其标记为IsDeterministic=true?此外,虽然我没有在 SQL Server 2017(甚至可能不是 2016 年)上进行测试,但我似乎确实记得即使通过 SQLCLR 的String.Format 也比 T-SQL 内置的 FORMAT 命令稍快(从2012?)调用相同的底层方法。确实很有趣:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2011-08-06
    • 2017-03-28
    相关资源
    最近更新 更多