为什么在存储过程中将整数传递给小数时会出现错误?

时间:2011-02-15 21:53:03

标签: sql-server tsql

调用存储过程时为什么会出错?

这失败了:

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.

2 个答案:

答案 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。