调用存储过程时为什么会出错?
这失败了:
exec dbo.foo 100
但这有效:
exec dbo.foo 99
定义:
CREATE PROCEDURE dbo.foo
(
@latitude DECIMAL (16,14)
)
AS
BEGIN
PRINT 'OK'
END
错误消息:
Msg 8114, Level 16, State 1, Procedure foo, Line 0
Error converting data type int to decimal.
答案 0 :(得分:12)
十进制(16,14) means "16 digits, 14 after decimal point"。这意味着在小数点之前有2 。 “100”超出范围,因为它是3个数字......
快速示例
DECLARE @fail decimal(16, 14), @pass decimal(17, 14)
BEGIN TRY
SET @pass = 100
END TRY
BEGIN CATCH
PRINT 'Will not see this'
END CATCH
BEGIN TRY
SET @fail = 100
END TRY
BEGIN CATCH
PRINT 'Will see this'
END CATCH
答案 1 :(得分:3)
我没有看到与失败的代码一起使用的代码之间的区别,但是它们都会失败。 DECIMAL
数据类型的第一个参数是您的号码可以拥有的最大位数;在你的情况下是16.第二个参数是为小数点右边的数字保留的位数。因此,您不能将{100}作为DECIMAL(16,14)
,而只需99.99999999999999。