
原文: 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
)

当然有三个以上的字段. 一个表有近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个表...无法手动构建
我是这样.

在SP中插入表的字段数据类型不正确,并且它们的名称都正确. 我只需要更改原始表的字段类型.
嗯,突然间我感到工作量减少了很多,哈哈.
我通过任务->执行脚本将原始SP的结构导出到表中.
导出原始系统使用的表结构.
比较这两个字段并更改相应的字段类型.
记录修改后的字段并编写相应的SQL语句进行修改.
我在测试中构建了一个测试测试
通过导出文件将SP构建到表中.
让我们执行我组织的SQL语句.
哈哈,我完成工作了吗?
当我修改原始SP并将select更改为insert into并执行时...
错了...
SQL Server报告出错:“将数据类型 varchar 转换为 numeric 时出错。”

我靠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. 我当时没注意到)

我查看了表中原始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
这就是报应
美国伟大的国家
南方黑芝麻糊的包装密封的很好