无法从select语句中调用标量值的CLR UDF

时间:2009-07-21 14:37:07

标签: sql-server sqlclr

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

我可以从简单的选择中调用它而不会出现问题: “select dbo.udfConvert('Romance Standard Time',@ datetime)” (@datetime当然是一个有效的日期时间变量)

但是,如果我将其称为从表中传递日期时间,则会失败: “从某些表中选择dbo.udfConvert('浪漫标准时间',StartTime)” (列StartTime当然是datetime类型的列)

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

这条消息非常适合那些拼写错误的初学者,但由于它适用于一个案例,而不是另一个案例,我认为我没有做过任何拼写错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我发现了问题。如果我将硬编码的时区提取到变量而不是它可以正常工作:

声明@timeZoneID nvarchar(100)

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

选择dbo.Convert(@ timeZoneID,StartTime)从sometable

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

答案 1 :(得分:0)

你也可以这样做:

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

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