原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理

SQL Server 字段类型 decimal(18,6)小数点前是几位?

不可否认,这是一个很低级的问题....

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

由于这个问题,导致一个数据导入的SP执行失败....以至于困扰了我好几个小时....

事情是这样的...

公司总部上了一套Oracle的ERP,我们系统中有些数据要从里面取,比如Supplier,Product等。

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 )

当然了 字段不止这三个,一个表有将近100个字段,这里只是举例说明问题。

同事这里用到了SELECT INTO语句。

SQL SELECT INTO 语句可用于创建表的备份复件。

这样写可以快速达到效果不用一个一个表去建并且保证数据可以完全导出过来。

但是这样写会有问题,

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

上述第三条会导致有些之前SP会报错....

你可能会说不用NULL as DT_UAMT用 '' as DT_UAMT。当然是可以的。

我也说过 这个SP是为了之前的系统能够跑起来写的,有些问题存在是正常的.....

然后解决这些问题就交给了我.....(我好苦逼,哭晕在厕所....)

毕竟SELECT INTO 语句可用于创建表的备份复件的,我们刷数据还是用insert into的好。

insert into 是需要表的。一个表将近100个字段...一共10几个表.....手动建肯定不可能了

我是这样想的。

之前SP中into的表只是字段数据类型不对,名称都是对的。我只需要把原来的表的字段类型修改对了就行了。

恩,忽然感觉工作量小了很多有没有,哈哈。

我通过数据库 任务->执行脚本  把原SP into的表的结构导出来。

再把原系统用的表结构导出来。

对比两个文件把相应的字段类型改一下。

并记录下修改的字段,写出相应的SQL 语句进行修改。

我在测试数据库中 建了一个测试数据库test

把SP into的表通过导出文件建好。

让执行我整理的SQL 语句。

哈哈,我的工作是不是做完了?

明显没有....在我修改原来的SP 将select into 改成insert into 并执行的时候.....

竟然报错了....

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

我靠,这是什么情况?

我改了很多decimal的...难道我一个一个去试试....

我还真一个一个去试了试。结果发现时DT_DAMT这个字段出错了。

难道是数据问题?数据中有不是数字的数据?

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

结果返回为空....

我去,都是数字啊。

这是什么情况?

难道长度超出了?

应该不会啊,我建的表中DT_DAMT字段是 decimal(18,6)类型。

并且同事写的SP中也是转化成了 decimal(18,6)

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

(额。。。貌似还乘以了100.当时没注意到)

我看了一下原SP into表的DT_DAMT类型decimal(18,2)

我靠 decimal(18,2)可以,我的decimal(18,6)就不行?

不过也没影响吧,都是decimal(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

Decimal 数据类型 介绍

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 介绍

语法ISNUMERIC ( expression )参数  expression  要计算的表达式。返回类型  int注释当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。

因此记录一下, 以便以后犯同样的错误。

SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理相关推荐

  1. Sql Server 字段类型说明

    字段类型 描述 bit 0或1的整型数字 int 从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字 smallint 从-2^15(-32,768)到2^ ...

  2. sql 根据日期模糊查询SQL Server dateTime类型 模糊查询

    曾经遇到这样的情况,在数据库的Meeting表中有PublishTime (DateTime,8)字段,用来存储一个开会时间,在存入时由于要指明开会具体时间,故格式为yyyy-mm-dd hh:mm: ...

  3. 【转载】SQL Server dateTime类型 模糊查询

    日期格式的like模糊查询真的好怪,在一个项目中,我试了很多种查法: select * from T where sendTime like '%2007_12_%'    可以查询2007年12月的 ...

  4. 7月12日 SQL Server 等待类型

     sys.dm_os_wait_stats (Transact-SQL) SQL Server 2014 其他版本 SQL Server 2012 SQL Server 2008 R2 SQL S ...

  5. SQL Server 方言类型映射问题

    关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取 转载于:https://www.cnblogs.com ...

  6. sql server等待类型

    sql server 各种等待类型-转 sql server各个等待类型及解决办法:https://www.sqlskills.com/help/waits/writelog/ 其他等待类型的描述和解 ...

  7. tfs 文件系统部署_使用SQL Server数据工具和使用自定义工作流文件的TFS部署到多个数据库

    tfs 文件系统部署 In the previous blog post : Deployment to several databases using SQL Server Data Tools a ...

  8. mysql修改表字段小数点精度_技术篇-将字段类型decimal批量处理从2位改为4位小数点sql,解决数据库存储精度...

    声明:本人对一些版权并不深入了解,但是这个脚本是真的好,帮我解决了问题,特此收藏,并且注明了原文链接,如有侵权,请告知删除. /* 脚本作用:原来定义为decimal(18,2)类型的所有统一修改为d ...

  9. sql server中的decimal或者numeric的精度问题 (转载)

    在sql server中定义列的数据类型decimal时需要制定其精度和小数位数. 何谓精度:最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数.该精度必须是从 1 到最大精度 38 之间的 ...

最新文章

  1. 广东电网计算机考试,考点爆料!2019广东电网计算机专业居然考这些!
  2. YoloV5 最强剪枝技术 模型压缩,3ms推理的YoloV5mAP60
  3. sublime Text 3 安装emmet
  4. javaScript第三天(1)
  5. 一场关于动态化开发实践的技术探讨
  6. 查看 rabbitmq 启动websocket 提示404_RabbitMQ 部署记录
  7. Typecho webstack开源导航主题
  8. svn\pristine\0a\0a66a6f1e12c54c3a0c3885a2bf5042977071358.svn-base系统找不到指定路径
  9. 顶岗实习阶段工作总结
  10. 资产标签二维码方案设计
  11. CE+OD外挂制作实战 [提高篇]
  12. 黑盒测试简介与其测试方法
  13. MatLab msgbox用法
  14. 程序员如何跳出死循环,不作所谓的“程序猿”
  15. 微服务 —— ThoughtWorks首席科学家的早期文章
  16. 太魔人招新|快来加入我们吧~
  17. React实战:留言板
  18. dma-buf 由浅入深(三) —— map attachment
  19. element中组件el-autocomplete远程搜索之精确匹配和模糊匹配
  20. google map的配置(Android版)

热门文章

  1. transparentblt函数实现透明贴图 (上)
  2. 苹果 开发者账号区别
  3. Android手机启动流程与TEE OS
  4. Ant Design源码分析(三):Wave组件
  5. Python 发送 email 的三种方式
  6. EV代码签名证书,支持Windows 10预览版和正式版驱动签名
  7. SQL Server-表表达式基础
  8. 用li列表模拟table式的表
  9. 如何合并两个Docker 镜像
  10. tomcat WARNING [ContainerBackgroundProcessor[StandardEngine[Catalina]]]