【问题标题】:Cannot call scalar-valued CLR UDF from select ... from table statement无法从 select ... from table 语句调用标量值 CLR UDF
【发布时间】:2010-11-12 16:13:18
【问题描述】:

我创建了一个标量值 CLR UDF(用户定义函数)。它需要一个时区 id 和一个日期时间,并返回转换为该时区的日期时间。

我可以毫无问题地从简单的选择中调用它: “选择 dbo.udfConvert('浪漫标准时间',@datetime)” (@datetime 当然是一个有效的日期时间变量)

但是,如果我调用它从表中传入日期时间,它会失败: “从某个表中选择 dbo.udfConvert('浪漫标准时间', StartTime)” (StartTime 列当然是 datetime 类型的列)

错误信息是: “找不到列“dbo”或用户定义的函数或聚合“dbo.udfConvert”,或者名称不明确。”

此消息确实适用于拼写错误的初学者,但由于它适用于一种情况而不适用于另一种情况,因此我认为我没有拼写错误。

有什么想法吗?

【问题讨论】:

    标签: sql-server sqlclr


    【解决方案1】:

    你也可以这样做:

    select dbo.udfConvert(N'Romance Standard Time', StartTime) from sometable
    

    如果您不使用 N 作为 Unicode 字符串常量的前缀,SQL Server 将在使用该字符串之前将其转换为当前数据库的非 Unicode 代码页。这就是为什么我找不到带有 nvarchar 签名的函数。

    【讨论】:

      【解决方案2】:

      我发现了问题。如果我将硬编码的时区提取到一个变量中,它就可以正常工作:

      声明@timeZoneID nvarchar(100)

      选择@timeZoneID='浪漫标准时间'

      从某个表中选择 dbo.Convert(@timeZoneID,StartTime)

      显然 sql-server 无法弄清楚如何将硬编码字符串转换为 nvarchar 字符串。

      【讨论】:

        猜你喜欢
        • 2014-12-28
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多