T-SQL :: 将 1 更改为 0.5 时将数据类型 varchar 转换为数字时出错
T-SQL :: Error converting data type varchar to numeric when changing 1 to 0.5
我正在用 CASE
编写一个复杂的 T-SQL 查询,这将帮助我计算根据每个数据库的大小迁移数据库需要多少时间:
SELECT
ProductVersion
,CompatibilityLevel
,convert(numeric(10,2), substring([Size], 1, (len([Size]) - 3))) as [Size in MB]
,CASE
when ProductVersion < '11%' THEN 1
when ProductVersion = NULL then 1
ELSE ''
END +
CASE
when CompatibilityLevel < '110' then 1
when CompatibilityLevel = NULL then 1
ELSE ''
END +
CASE
when convert(numeric(10,2), substring([Size], 1, (len([Size]) - 3))) < 100.00 THEN 1 -- Here is the problem
ELSE ''
END AS [Hours of work]
FROM MyDatabaseList
很好,当我为每个小于 100.00 MB 的数据库设置 1 小时的工作时它有效。
所有其他值也相加,在“工作时间”列中,您可以看到 0
、1
、3
、2
...
这意味着 SQL 服务器正在计算值。一切顺利。
但是,告诉我的经理我必须为一个只有 100.00 MB 大小的数据库工作 1 小时是荒谬的。
让我们换行:
when convert(numeric(10,2), substring([Size], 1, (len([Size]) - 3))) < 100.00 THEN 1
让我们用 0.5
代替 1
:
when convert(numeric(10,2), substring([Size], 1, (len([Size]) - 3))) < 100.00 THEN 0.5
...然后爆炸 - 我收到此错误:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.
问题:
- 为什么现在出现这个错误?
- 为什么之前计算成功,现在需要某处的数据类型?
- 我必须对查询添加什么更改?
- 为什么在
Line 1
上显示?错误一定是在Line 16
对吧?
错误告诉您转换发生在从第 1 行开始的语句中。
至于为什么,是因为''
不能转成numeric
,但可以转成int
。
SELECT CONVERT(decimal(2,1),'')
--Error converting data type varchar to numeric.
GO
SELECT CONVERT(int,'')
--
GO
您之前将其转换为 int
(文字 1
是 int
)。改掉为数字声明 ''
的习惯;它根据定义 不是 一个数字,它是一个零长度的字符串。如果你想要零,那么使用 0
.
我正在用 CASE
编写一个复杂的 T-SQL 查询,这将帮助我计算根据每个数据库的大小迁移数据库需要多少时间:
SELECT
ProductVersion
,CompatibilityLevel
,convert(numeric(10,2), substring([Size], 1, (len([Size]) - 3))) as [Size in MB]
,CASE
when ProductVersion < '11%' THEN 1
when ProductVersion = NULL then 1
ELSE ''
END +
CASE
when CompatibilityLevel < '110' then 1
when CompatibilityLevel = NULL then 1
ELSE ''
END +
CASE
when convert(numeric(10,2), substring([Size], 1, (len([Size]) - 3))) < 100.00 THEN 1 -- Here is the problem
ELSE ''
END AS [Hours of work]
FROM MyDatabaseList
很好,当我为每个小于 100.00 MB 的数据库设置 1 小时的工作时它有效。
所有其他值也相加,在“工作时间”列中,您可以看到 0
、1
、3
、2
...
这意味着 SQL 服务器正在计算值。一切顺利。
但是,告诉我的经理我必须为一个只有 100.00 MB 大小的数据库工作 1 小时是荒谬的。
让我们换行:
when convert(numeric(10,2), substring([Size], 1, (len([Size]) - 3))) < 100.00 THEN 1
让我们用 0.5
代替 1
:
when convert(numeric(10,2), substring([Size], 1, (len([Size]) - 3))) < 100.00 THEN 0.5
...然后爆炸 - 我收到此错误:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.
问题:
- 为什么现在出现这个错误?
- 为什么之前计算成功,现在需要某处的数据类型?
- 我必须对查询添加什么更改?
- 为什么在
Line 1
上显示?错误一定是在Line 16
对吧?
错误告诉您转换发生在从第 1 行开始的语句中。
至于为什么,是因为''
不能转成numeric
,但可以转成int
。
SELECT CONVERT(decimal(2,1),'')
--Error converting data type varchar to numeric.
GO
SELECT CONVERT(int,'')
--
GO
您之前将其转换为 int
(文字 1
是 int
)。改掉为数字声明 ''
的习惯;它根据定义 不是 一个数字,它是一个零长度的字符串。如果你想要零,那么使用 0
.