2012-04-19 50 views
2

好的我有一个数字是一个nvarchar并有2个小数位。如果我通过一个非常简单的函数运行它,它会将所有小数位更改为零,我不知道为什么或如何停止它。为什么SQL函数将小数位更改为全零?

这里是基本功能(实际上是较大功能的一部分,但这是导致我的问题的原因)。

create FUNCTION [dbo].[z_test](@amt as nvarchar) 
RETURNS decimal(18,4) 
BEGIN 
declare @amt1 as decimal(18,4) 
set @amt1=cast(@amt as decimal(18,4)) 
return @amt1 
END 

所以,如果我跑这条SQL语句

select cast('3.48' as decimal(18,4)), dbo.z_test('3.48') 

我希望返回的列是相同的。然而,我得到的是 3.4800 3.0000

任何想法为什么发生这种情况或我可以如何改变它?这是在SQL Server 2005. 在此先感谢。

+0

是否有可能发布全功能?我无法看到你提供的代码片段的问题 – Curt 2012-04-19 14:13:13

回答

3

您应指定在你的函数参数nvarchar的长度,否则将承担1的长度在这种情况下,截断你的输入:

(@amt as nvarchar(10)) 
+0

啊..是的,我还记得有一些直接的nvarchar字段。谢谢 – 2012-04-19 14:21:05

3

你的输入变量被截断。

根据MSDN:http://msdn.microsoft.com/en-us/library/ms186939.aspx

当在数据定义或变量声明语句未指定n,则默认长度为1.当不与CAST函数指定n,则默认长度为30。

给了NVARCHAR大小和按照预期的功能将工作:

create FUNCTION [dbo].[z_test](@amt as nvarchar(10)) 
RETURNS decimal(18,4) 
BEGIN 
declare @amt1 as decimal(18,4) 
set @amt1=cast(@amt as decimal(18,4)) 
return @amt1 
END 
+0

+1链接和默认值 – 2012-04-19 14:27:34