2

好的,我有一个 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 中。提前致谢。

4

2 回答 2

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
于 2012-04-19T14:15:21.133 回答
3

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

(@amt as nvarchar(10))
于 2012-04-19T14:13:56.433 回答