2010-06-25 110 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,则具有相同的选项 - 两者都内置了可为您执行四舍五入的功能。这可能需要一些操作,但您也可以将用户定义的比例值传递给它们。