2010-06-25 52 views
1

我需要將一個十進制值舍入到作爲參數傳遞的deicmal位置。 通過這樣做: 選擇輪(N,@ a)由tbl_Testsql循環函數

其中n是類型的小數18,4 和@ A = 2 我得到的結果,但兩個零點在最後加入。 我想得到沒有那個零的結果..但返回值應該是ype decimal..not string。

是否有可能像下面這樣:cast(round(n,@ a)as decimal(18,@ a))?

+3

你爲什麼試圖在數據庫中顯示格式?不應該有多少額外的零返回。讓消費應用程序或報告格式化值,使其看起來正確。 – Thomas 2010-06-25 04:27:35

+0

你有沒有得到你正在尋找的答案?如果是這樣,你能接受嗎?如果不是,你能澄清你還在尋找什麼嗎?通常情況下,你提供的信息越多,他可以幫你的可能性就越大。 – MaasSql 2010-07-01 00:40:58

回答

0

如果你只想要2位小數,你需要在定義改變比例爲2。所以,完全按照自己的設想:

投(圓(N,@一)爲十進制( 18,@ a))

MS SQL Server不支持在數據類型定義中使用參數。現在,「客戶端」代碼的確如此。所以,像這樣的一種方法可能適用於你,(或者用t-sql編寫的db sproc或者用c#編寫的業務層編寫)。

use tempdb; 
go 
create 
--drop 
table tbl_test 
(n decimal (18, 4)); 
declare @n as decimal (18, 4); 
SET @n = 12.0006; 
insert into tbl_test (n) values (@n); 
SET @n = 12.0060; 
insert into tbl_test (n) values (@n); 
SET @n = 12.0600; 
insert into tbl_test (n) values (@n); 
SET @n = 12.6000; 
insert into tbl_test (n) values (@n); 

select 
    cast (round (n, 2) as decimal (18, 2)) 
    , n 
from tbl_test 
order by n ASC 

declare @var_scale integer; 
set @var_scale = 2; 
declare @sql nvarchar(max) = N' 
select 
    cast (round (n, @a) as decimal (18, @a)) 
    , n 
from tbl_test 
order by n ASC 
' 
set @sql = REPLACE (@sql, '@a', @var_scale); 
execute (@sql); 

但是,就像托馬斯在你的問題中的第一個評論說,沒有一個很好的解釋,爲什麼,這看起來像純粹的愚蠢。例如,在C#中,作爲一個在字段n中消費價值的人,可以簡單地舍入到2個地方。文章見this stackoverflow。如果客戶端是Crystal Reports或Sql Server Reporting Services,則具有相同的選項 - 兩者都內置了可爲您執行四捨五入的功能。這可能需要一些操作,但您也可以將用戶定義的比例值傳遞給它們。