关于数值类型的处理

浩子 2006-07-07 03:00:25
我有个字段DataValue是decimal类型的,默认情况下每个值都是以4位的形式展现出来,我想把这个数据类型转换成指定位数的,注意,是动态位数(T_D.DataPrecision),该怎么办呢?

我用STR(T_A.DataValue,10,T_D.DataPrecision),返回虽然正确了,但是变成了字符型,
用DataValue = CAST(T_A.DataValue AS DECIMAL(10,T_D.DataPrecision))却执行不了,
大家给我出出主意吧,

------------------------------------
参考代码:
SELECT T_A.DataID, T_A.ExamParmID, T_A.DataTime, DataValue = STR(T_A.DataValue,10,T_D.DataPrecision),
ModifyDataValue = CAST(T_B.DataValue AS DECIMAL(10,T_D.DataPrecision)), T_B.Demo, T_C.StationID, T_C.ParamCode, T_C.MinValue,
T_C.MaxValue, T_D.ParamRemark, T_D.DataPrecision, T_D.ParamUnit
FROM T_StartData T_A LEFT JOIN
T_EndData T_B ON T_A.DataID = T_B.DataID JOIN
T_ExamProject T_C ON T_A.ExamParmID = T_C.ExamParmID JOIN
T_DataParam T_D ON T_C.ParamCode = T_D.ParamCode
------------------------------------
...全文
278 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
OracleRoob 2006-07-09
  • 打赏
  • 举报
回复
同一列的类型应该是一致的,包括小数位数。

hellowork 2006-07-09
  • 打赏
  • 举报
回复
试试这样变通行不行:
----建立测试数据
if object_id('test') is not null
drop table test
create table test(DataPrecision int,DataValue decimal(10,5))
insert test
select 0,123.456 union all
select 1,123.4567 union all
select 2,123.45678 union all
select 3,123.45678 union all
select 4,123.45678
go
----方法一:根据DataValue列的小数长度定义,写出所有可能的小数位数,例如本例中为5.
/*本方法缺点是转换后结果的小数位数是when中最大值,而无论表中DataPrecision到底有没有这个最大值.
如本例中when最大值为5,而表中DataPrecision的最大值为4,但转换结果的小数长度全为5.看看转换结果就知道了.
*/
SELECT DataPrecision,DataValue,
case DataPrecision
when 0 then cast(DataValue as decimal(10,0))
when 1 then cast(DataValue as decimal(10,1))
when 2 then cast(DataValue as decimal(10,2))
when 3 then cast(DataValue as decimal(10,3))
when 4 then cast(DataValue as decimal(10,4))
when 5 then cast(DataValue as decimal(10,5))
else
DataValue
end
as DataValue2
FROM test
----方法二,根据DataPrecision的最大值动态创建SQL语句,保证转换结果的小数位数为该最大值.可以使用print语句查看SQL语句.
declare @max int
declare @i int
declare @str varchar(1000)
declare @sql varchar(2000)
----获得DataPrecision的最大值,本例中为4
select @max = max(DataPrecision) from test
set @i = 0
set @str = 'case DataPrecision ' + char(10)
----生成所有可能的转换表达式
while @i <= @max
begin
set @str = @str + ' when ' + cast(@i as varchar(2)) + ' then cast(DataValue as decimal(10,' + cast(@i as varchar(2)) + '))' + char(10)
set @i = @i + 1
end
set @str = @str + ' else cast(DataValue as decimal(10,2)) end' + char(10) + ' as DataValue2'
set @sql = 'SELECT DataPrecision,DataValue,' + char(10) + @str + ' FROM TEST'
----查看SQL语句
print @sql
----执行,转换后小数最大位数为4
exec (@sql)
----清除测试环境
drop table test
zjcxc 元老 2006-07-08
  • 打赏
  • 举报
回复
用str可行, 是因为str的结果是字符, 所以跟小数位没有关系了, 都是字符
zjcxc 元老 2006-07-08
  • 打赏
  • 举报
回复
在一个表中, 一个列的类型是确定的, 所有记录中, 这个列的类型都是一样的, 包括小数位.
而楼主要想实现的, 却是不同的记录在同一列上有不同的小数位, 这是做不到的.
xyxfly 2006-07-07
  • 打赏
  • 举报
回复
不会,关注......
浩子 2006-07-07
  • 打赏
  • 举报
回复
浩子 2006-07-07
  • 打赏
  • 举报
回复
说到正点了,
请问如何从字段值获呢,如果这个搞定了,应该就差不多了:P
fcuandy 2006-07-07
  • 打赏
  • 举报
回复
转换为 DECIMAL时,后面的参数只能是常量,不能用变量,或是从字段值获取。这一点跟函数的嵌套不同,因为定义数据类型涉及到内存的分配。

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧