[服务器sql仅获得2个小数位]

电脑杂谈  发布时间:2020-04-02 08:02:56  来源:网络整理

sql中取小数点后两位_sql中如何取前三条记录_sqlserver取两位小数

原文: SQL Server字段类型十进制(18,6)小数点前有几位数?SP的BUG处理

SQL Server字段类型十进制(18,6)小数点前多少位?

诚然,这是一个非常底层的问题....

为什么要问这么低级的问题?

由于这个问题,数据导入SP的执行失败了……它困扰了我几个小时…….

公司总部拥有一套Oracle ERP. 我们系统中的某些数据必须从中获取,例如供应商,产品等.

Oracle将导出数据文件. 我们使用SSIS刷新相应的本地(的字段与Oracle的字段相同).

对于我们来说,数据源已更改. 我们需要将Oracle数据转换为我们的第一个系统可以使用的数据.

由于Oracle的运行速度相对较快,为了使现有系统基本运行,我的同事编写了一个SP以导入到我们系统的中.

此SP很粗糙.

同事在处理后将Oracle数据处理到AS系统的字段中.

sql语句如下:

SELECT
[DT_UAMT],[DT_DAMT],[DT_AMT]
INTO Temp_DT_PODT
FROM 
(
   NULL AS DT_UAMT
,convert(varchar,convert(decimal(18,6),isnull(usd_amount,'0') * 100)) as DT_DAMT
,convert(varchar,convert(decimal(18,6),isnull(LINE_AMOUNT,'0') * 100)) as DT_AMT
FROM  OracleDB.[dbo].OracleTB 
)

sql中取小数点后两位_sqlserver取两位小数_sql中如何取前三条记录

当然有三个以上的字段. 一个表有近100个字段. 这只是一个例子.

我的同事在这里使用了SELECT INTO语句.

SQL SELECT INTO语句可用于创建表的备份副本.

以这种方式编写可以快速实现效果,而不必一个接一个地建立表并确保可以完全导出数据.

但是以这种方式编写会出现问题,

1、首先SELECT INTO需要into的这个表不存在,所以每次都需要把Temp_DT_PODT给Drop掉。
2、由于Oracle的字段类型和我们的不一样,会导致创建出来的字段类型和我们原的类型不一样。
3、当用 null as成一个字段的时候,into的表中对应字段类型为int

上面的第三项将导致某些先前的SP报告错误....

您可能会说NULL asDT_UAMT而不是''asDT_UAMT. 当然可以.

我还说过sql中取小数点后两位,此SP是为先前的系统运行而编写的,有些问题是正常的.....

然后我解决了这些问题,并将它们交给了我.....(我很难受,在厕所里哭泣...)

毕竟,可以使用SELECT INTO语句创建表的备份副本. 我们仍然使用insert into刷新数据.

插入需要一个表. 一个表中有近100个字段...总共10个表...无法手动构建

我是这样.

sql中取小数点后两位_sqlserver取两位小数_sql中如何取前三条记录

在SP中插入表的字段数据类型不正确,并且它们的名称都正确. 我只需要更改原始表的字段类型.

嗯,突然间我感到工作量减少了很多,哈哈.

我通过任务->执行脚本将原始SP的结构导出到表中.

导出原始系统使用的表结构.

比较这两个字段并更改相应的字段类型.

记录修改后的字段并编写相应的SQL语句进行修改.

我在测试中构建了一个测试测试

通过导出文件将SP构建到表中.

让我们执行我组织的SQL语句.

哈哈,我完成工作了吗?

当我修改原始SP并将select更改为insert into并执行时...

错了...

SQL Server报告出错:“将数据类型 varchar 转换为 numeric 时出错。”

sqlserver取两位小数_sql中如何取前三条记录_sql中取小数点后两位

我靠sql中取小数点后两位,这是怎么回事?

我更改了很多小数点...我会一一尝试...

我真的一一尝试了. 事实证明,DT_DAMT字段中发生了错误.

这是数据问题吗?数据中有数据吗?

select DT_DAMT from  OracleDB.[dbo].OracleTB  where isnumeric(DT_DAMT )!=1

结果返回为空....

我去,所有数字.

发生了什么事?

时间太长吗?

可能不是. 我建立的表中的DT_DAMT字段的类型为十进制(18,6).

同事写的SP也被转换为十进制(18,6)

convert(varchar,convert(decimal(18,6),isnull(usd_amount,'0') * 100)) as DT_DAMT

(嗯……似乎已经乘以100. 我当时没注意到)

sql中如何取前三条记录_sqlserver取两位小数_sql中取小数点后两位

我查看了表中原始SP的DT_DAMT类型十进制(18,2).

我可以用十进制(18,2)来做,但不能用十进制(18,6)吗?

但这没关系,它们都是十进制(18,*)类型. 小数点前应为18位数字.

我真的是这样.

所以我执行了一条SQL语句.

Select convert(decimal(18,2),isnull(LINE_AMOUNT,'0') ) as DT_DAMT
FROM OracleDB.[dbo].OracleTB 

没有错误...

Select convert(decimal(18,6),isnull(LINE_AMOUNT,'0') ) as DT_DAMT
FROM OracleDB.[dbo].OracleTB 

原来是错的

SQL Server报告出错:“将数据类型 varchar 转换为 numeric 时出错。”

所以我决定使用百度十进制

Decimal为SQL Server、MySql等的一种数据类型,不属于浮点数类型,可以在定义时划定整数部份以及小数部分的位数。使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间,例如百分比使用decimal(4,2)即可。存储数据范围是:-10^38~10^38-1 的固定精度和小数位的数字。一个decimal类型的数据占用了2~17个字节。
decimal[ (p[ , s] )]
p (有效位数)
可储存的最大十进位数总数,小数点左右两侧都包括在内。有效位数必须是 1 至最大有效位数 38 之间的值。预设有效位数是 18。
s (小数位数)
小数点右侧所能储存的最大十进位数。小数位数必须是从 0 到 p 的值。只有在指定了有效位数时,才能指定小数位数。预设小数位数是 0;因此,0 <= s <= p。最大储存体大小会随著有效位数而不同。
Decimal(p,s)表示数值中共有n位数,其中整数p-s位,小数s位。例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位。
decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位。
语法
ISNUMERIC ( expression )
参数  expression  要计算的表达式。
返回类型  int
注释
当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。

因此请保留记录,以便以后可以犯同样的错误.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-161005-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...