SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理
原文: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,'') * 100)) as DT_DAMT
,convert(varchar,convert(decimal(18,6),isnull(LINE_AMOUNT,'') * 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,'') * 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,'') ) as DT_DAMT
FROM OracleDB.[dbo].OracleTB
没报错....
Select convert(decimal(18,6),isnull(LINE_AMOUNT,'') ) as DT_DAMT
FROM OracleDB.[dbo].OracleTB
竟然报错了
SQL Server报告出错:“将数据类型 varchar 转换为 numeric 时出错。”
于是我果断百度一下 Decimal
Decimal 数据类型 介绍
Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部份以及小数部分的位数。使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间,例如百分比使用decimal(,)即可。存储数据范围是:-^~^- 的固定精度和小数位的数字。一个decimal类型的数据占用了2~17个字节。
decimal[ (p[ , s] )]
p (有效位数)
可储存的最大十进位数总数,小数点左右两侧都包括在内。有效位数必须是 至最大有效位数 之间的值。预设有效位数是 。
s (小数位数)
小数点右侧所能储存的最大十进位数。小数位数必须是从 到 p 的值。只有在指定了有效位数时,才能指定小数位数。预设小数位数是 ;因此, <= s <= p。最大储存体大小会随著有效位数而不同。
Decimal(p,s)表示数值中共有n位数,其中整数p-s位,小数s位。例:decimal(,),数值中共有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处理的更多相关文章
- sql 根据日期模糊查询&SQL Server dateTime类型 模糊查询
曾经遇到这样的情况,在数据库的Meeting表中有PublishTime (DateTime,8)字段,用来存储一个开会时间,在存入时由于要指明开会具体时间,故格式为yyyy-mm-dd hh:mm: ...
- Oracle/SQL 修改字段类型和长度
标准SQL修改字段类型和长度语句: ALTER TABLE tableName modify column columnName 类型;例如Mysql的修改字段类型语句:alter table tes ...
- SQL Server锁类型
SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生 ...
- sql server等待类型
sql server 各种等待类型-转 sql server各个等待类型及解决办法:https://www.sqlskills.com/help/waits/writelog/其他等待类型的描述和解决 ...
- MS SQL server对象类型type
执行下面代码,将获取ms sql server对象类型以及其说明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREAT ...
- SQL Server时间类型datetime
SQL Server时间类型datetime 兼容ADO的COleDateTime. SQL datetime 日期和时间数据,可表示1753.1.1 至 9999.12.31的时间,精度为1/300 ...
- SQL Server 方言类型映射问题
关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取
- sql server 导出的datetime结果 CAST(0x00009E0E0095524F AS DateTime) 如何向mysql,oracle等数据库进行转换
1. 处理 sql server 导出的 datetime 类型的字段 在进行sql server向mysql等其他数据进行迁移数据时,会发现使用sql server导出的datetime类型的结果是 ...
- SQL Server中,Numric,Decimal,Money三种字段类型的区别
都是精确数据类型, 前两个可以自己定义长度和小数位数, Money的定义相当于Numric(19,4) numeric(10,2) 表示最大可以放10位数,但这10位数里有2位是小数如: 123456 ...
随机推荐
- jvm常用参数设置 good
1.堆的大小可以通过 -Xms 和 -Xmx 来设置,一般将他们设置为相同的大小,目的是避免在每次垃圾回收后重新调整堆的大小,比如 -Xms=2g -Xmx=2g 或者 -Xms=512m -Xmx= ...
- Vmdk文件如何使用,vmdk导入虚拟机VMware8.0教程
一.打开虚拟机VMware Workstation8.0,点击新建虚拟机. 二.进入虚拟机向导,选择自定义. 三.这里保持默认即可. 四.这里选择“我以后安装操作系统”. 五.这里选择Windows ...
- 【Demo 0005】Android 资源
本章学习要点: 1. 了解Android中资源用途: 2. 掌握资源使用通用规则: 3. 掌握具体资源使用方法; 一.Android资源 a ...
- ASP.NET - 获得客户端的 IP 地址
通常我们都通过下面的代码获得IP: REMOTE_ADDR 说明:访问客户端的 IP 地址. 此项信息用户不可以修改.如果真的给改了的话,你也和服务器连接不了了,服务器就是按照这个来与客户端建立连接并 ...
- 百度地图js版定位控件
一 概述 百度地图在最新版已加入浏览器定位控件,个人认为应该是既高德地图更新了一个浏览器也能定位功能后,百度不甘落后自己简简单单,草草写了个这个功能的定位控件 GeolocationControl 这 ...
- 怎样高速正确的安装 Ruby, Rails 执行环境
对于新入门的开发人员,怎样安装 Ruby, Ruby Gems 和 Rails 的执行环境可能会是个问题,本页主要介绍怎样用一条靠谱的路子高速安装 Ruby 开发环境. 次安装方法相同适用于产品环境! ...
- Swift - 工具条(UIToolbar)的用法
1,UIBarButtonItem是工具条按钮,有如下5种init初始化方法: (1)初始化为普通图片按钮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...
- 11 款最好 CSS 框架 让你的网站独领风骚
网页设计和发展领域已经成为竞争激烈的虚拟世界.想要在网络的虚拟世界中生存,仅有一堆静止的在线网络应用是远远不够的,网页必须要有很多功能,配以让人无法抗拒的设计.网页编码一定要合适.精确,才能保证不发生 ...
- windows下Memcached 架设及java应用
1 Memcached 介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据 ...
- Automatic logon configuration on Linux OS
Automatic logon configuration on Linux OS 1. Regarding to DSA: a) ssh-keygen -t dsa b) cat ~/.ssh/i ...