c# - 尝试发布 SQL CLR 数据库的日期时间类型不匹配

标签 c# .net sql-server sqlclr

我正在尝试建立一个旧的解决方案,该解决方案将许多 .net 函数发布到 SQL Server 数据库。但是发布到新数据库的尝试在操作日期的函数上失败了。

失败的函数是:

[SqlFunction(TableDefinition="localtime datetime2", IsDeterministic=true, IsPrecise=true,
             DataAccess=DataAccessKind.None,
             SystemDataAccess=SystemDataAccessKind.None)]
public static DateTime ConvertFromUTC(DateTime utctime, string timezoneid)
{
    if (utctime.Kind == DateTimeKind.Unspecified)
        utctime = DateTime.SpecifyKind( utctime, DateTimeKind.Utc );

    utctime = utctime.ToUniversalTime();

    return TimeZoneInfo.ConvertTimeBySystemTimeZoneId( utctime, timezoneid );
}

我在尝试发布时收到的错误消息是:

Creating [dbo].[ConvertFromUTC]...

(268,1): SQL72014: .Net SqlClient Data Provider:

Msg 6551, Level 16, State 2, Procedure ConvertFromUTC, Line 1
CREATE FUNCTION for "ConvertFromUTC" failed because T-SQL and CLR types for return value do not match.

(268,0): SQL72045: Script execution error

从 .net 生成的 SQL 试图添加函数:

CREATE FUNCTION [dbo].[ConvertFromUTC]
    (@utctime DATETIME, @timezoneid NVARCHAR (MAX))
RETURNS TABLE ([localtime] DATETIME2 (7) NULL)
AS EXTERNAL NAME [database].[IntelligentTutor.Database.Functions].[ConvertFromUTC]

现有数据库中函数版本的 SQL 定义(确认@MattJohnson 关于如何修复它是正确的):

CREATE FUNCTION [dbo].[ConvertFromUTC]
    (@utctime [datetime], @timezoneid [nvarchar](4000))
RETURNS [datetime] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [database].[IntelligentTutor.Database.Functions].[ConvertFromUTC]

最佳答案

SQL 函数与 .NET 方法签名不匹配。使其匹配:

  1. 在函数定义中将 @utctime 的类型更改为 DATETIME2 而不是 DATETIME

    <
  2. 将返回类型更改为仅 RETURNS DATETIME2,而不是返回具有可为 null 的 datetime2 列的表。

另请注意,如果您使用的是 SQL 2016 或更高版本,或者使用的是 Azure SQL DB,则不需要此功能,因为您现在可以使用 AT TIME ZONE 代替。

关于c# - 尝试发布 SQL CLR 数据库的日期时间类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45066148/

相关文章:

c# - 调用 dll 时从未命中断点

sql-server - 在 SQL 中生成 8 个字符的随机字母数字字符串的最有效方法是什么?

c# - 使用并行写入 MongoDB 时出错

c# - 使用 LINQ 查询获取包含当前列表中任何数值的新列表

c# - XDocument 未正确加载

c# - 使用 Windows 窗体从主窗口更新无模式对话框

c# - ASP.NET MVC 4 jQuery 验证脚本包不工作

c# - 将阻塞调用包装为异步以实现更好的线程重用和响应式 UI

sql-server - SQL Server 过滤索引

sql - 在表连接中使用 COUNT 函数