我正在开发一个C#中的订单管理Web项目,可以提供给多个客户端。
在'命令'表,我有一个字段'数量' 4位小数。 现在并非所有客户都需要4个小数位,所以我有 一张桌子' Config'它将此值保存在字段' QtyDecimal'。
中目前我正在做的显示正确的小数位数是这样的:
string xQtyDec = getQtyDecimalFromConfig();
sqlCommand = "Select CAST(Qty as numeric(18," + xQtyDec + ")) [Quantity] from orders";
...
我想知道这是否可以在SQL本身完成,比如
SELECT CAST(Qty as numeric(18, (SELECT QtyDecimal FROM config))) [Quantity] from orders
这可能吗?
答案 0 :(得分:1)
根据Sql服务器语法,请参阅https://msdn.microsoft.com/en-us/library/ms174979.aspx数据类型参数(精度和小数位数)必须是文字。他们不能成为表达。 在客户端,你最好做那样的事情。或者使用round(),将结果转换为最大可能的比例(4)并从字符串表示中删除额外的零
declare @s int = 2; -- scale config parameter, = 0..4
select t.col, substring(calc.v, 1, len(calc.v) -(4-@s))
from (--- sample data
values (12345.06789)
, (8765000.1)
) t(col)
cross apply (
select v = cast(cast(round(col, @s) as numeric (18,4)) as varchar(20))
) calc
答案 1 :(得分:1)
在SQL Server中,您需要构建动态查询以实现结果。
DECLARE @Scale NVARCHAR(50)
SELECT @scale= QtyDecimal FROM config
DECLARE @sql NVARCHAR(500)='SELECT CAST(Qty as numeric(18, ' +@scale+')) [Quantity] from orders'
EXEC (@sql)
答案 2 :(得分:0)
是的,这是可能的,但您应该将查询重写为:
SELECT CAST(orders.Qty as numeric(18, (config.QtyDecimal))) AS [Quantity] from orders, config
WHERE {some selection on config table to get the correct QtyDecimal}
答案 3 :(得分:0)
最好的选择不是这样做,而是在转换数据集进行显示或下载时在C#中执行此操作。但是,如果您需要在SQL中执行此操作,则可以使用以下方法之一。
方法1:
Select CAST(CASE (select xQtyDecimal from Config)
WHEN 1 then CAST(FieldName as NUMERIC(10,1)
WHEN 2 then CAST(FieldName as NUMERIC(10,2)
WHEN 3 then CAST(FieldName as NUMERIC(10,3)
WHEN 4 then CAST(FieldName as NUMERIC(10,4)
WHEN 5 then CAST(FieldName as NUMERIC(10,5)
ELSE FieldName END AS NUMERIC(10,6)) As FieldNameAlias
From TableName
方法2:
SELECT CAST(CAST(FieldName * POWER(10, (select xQtyDec from config)) as BIGINT) AS NUMERIC(20,10))/POWER(10, (select xQtyDec from config))
FROM TableName