2017年4月18日 星期二

[SQL Server] 使用RETURN回傳數值發生Overflow

我們經常藉由 T-SQL 中的RETURN,來中斷我們的Stored procedure、一段batch.
有時候也會透過RETURN來回傳一個數值。

但有些人可能不知道 : 透過RETURN只能回傳 INT 大小的數值(-2,147,483,648 to 2,147,483,647)
如果數值超過此大小便會發生Overflowexception
即便你有宣告BIGINTDECIMAL來承接參數。


我們來實際測試一下

CREATE PROCEDURE [dbo].[test]
AS
BEGIN
    DECLARE @returnValue Numeric(20,4) = 0;
    SET @returnValue = 9999999999999 --Greater than integar maximum size
    RETURN @returnValue;
END

GO

EXEC dbo.Test
GO

DROP PROCEDURE dbo.Test


解決方法 :

l   如果只是單純要回傳值,將原本RETURN取代為SELECT是最快的。
CREATE PROCEDURE [dbo].[test]
AS
BEGIN
    DECLARE @returnValue Numeric(20,4) = 0;
    SET @returnValue = 9999999999999 --Greater than integar maximum size
    SELECT @returnValue;
  RETURN;
END
GO
l   如果你有外層Stored procedure需要承接從此Stored prcoedure的參數,可以考慮OUTPUT參數。
CREATE PROCEDURE [dbo].[test]
    @outputVal Numeric(20,4) OUTPUT
AS
BEGIN
    SET @outputVal = 9999999999999 --Greater than integar maximum size
END

GO
DECLARE @val Numeric(20,4)
EXEC dbo.Test @val OUTPUT
SELECT @val
GO

DROP PROCEDURE dbo.Test


沒有留言:

張貼留言