【发布时间】:2015-11-22 09:19:06
【问题描述】:
我使用 BCP 将大量数据导入到包含所有字符串的 SQL Server 中。为了进一步保持数据库的完整性,我将更改所有列以获取正确的元数据。
我有一个实际包含十进制值的当前字符串列,需要更改该列以使其成为十进制(p,s)。
由于数据量大,我写了如下查询来获取小数点前后字符串的最大长度;从小数点前后添加字符串的长度以获得精度。以下查询将显示我到达的位置:
SELECT
'('
+
CAST(MAX(LEN(LEFT(Measure, LEN(Measure) - LEN(SUBSTRING(Measure, CHARINDEX('.', Measure) , 255)))))
+
MAX(LEN(SUBSTRING(Measure, CHARINDEX('.', Measure) +1, 255))) AS varchar(5))
+
','
+ CAST(MAX(LEN(SUBSTRING(Measure, CHARINDEX('.', Measure) +1, 255))) AS varchar(5))
+
')' AS 'max[p,s]'
FROM
Result
结果如下:
max[p,s]
--------
(24,19)
当我通过陈述以下内容更改列时:
ALTER TABLE Result
ALTER COLUMN Measure DECIMAL (24,19)
我收到以下错误:
消息 8115,级别 16,状态 8,第 1 行算术溢出错误 将 varchar 转换为数字数据类型。该声明已 终止。
(p,s) 其中 p = 精度和 s = 比例;我的印象是我的最大精度 (p) 可以达到 38。为什么会出现此错误?有什么建议?我必须不丢失任何精度。
【问题讨论】:
-
您确定该列中没有任何非数字值吗?
-
@APH 列中没有非数字值
标签: sql-server sql-server-2012 decimal precision