2012-04-19 66 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