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

Med*_*Man 3 t-sql sql-server

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

这失败了:

exec dbo.foo 100
Run Code Online (Sandbox Code Playgroud)

但这有效:

exec dbo.foo 99
Run Code Online (Sandbox Code Playgroud)

定义:

CREATE PROCEDURE dbo.foo
(
   @latitude DECIMAL (16,14)
)
AS
BEGIN
    PRINT 'OK'
END
Run Code Online (Sandbox Code Playgroud)

错误信息:

Msg 8114, Level 16, State 1, Procedure foo, Line 0
Error converting data type int to decimal.
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 12

十进制(16,14)表示"16位数,小数点后14位".这意味着小数点 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
Run Code Online (Sandbox Code Playgroud)