为什么SQL函数将小数位更改为全零?

时间:2012-04-19 14:06:58

标签: tsql sql-server-2005

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

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

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中。 提前谢谢。

2 个答案:

答案 0 :(得分:3)

您应该在函数参数中指定nvarchar的长度,否则在这种情况下它会假定长度为1,截断您的输入:

(@amt as nvarchar(10))

答案 1 :(得分: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