我创建了一个标量值的CLR UDF(用户定义的函数)。它需要一个时区id和一个日期时间,并返回转换为该时区的日期时间。
我可以从简单的选择中调用它而不会出现问题: “select dbo.udfConvert('Romance Standard Time',@ datetime)” (@datetime当然是一个有效的日期时间变量)
但是,如果我将其称为从表中传递日期时间,则会失败: “从某些表中选择dbo.udfConvert('浪漫标准时间',StartTime)” (列StartTime当然是datetime类型的列)
错误消息是: “无法找到列”dbo“或用户定义的函数或聚合”dbo.udfConvert“,或者名称不明确。”
这条消息非常适合那些拼写错误的初学者,但由于它适用于一个案例,而不是另一个案例,我认为我没有做过任何拼写错误。
有什么想法吗?
答案 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签名的函数。