SQL Server:货币转换器功能

时间:2019-01-21 14:02:01

标签: sql-server

我创建的函数可以将任何货币转换为£POUND St​​erling。实际上,任何货币都限于功能中定义的货币。

该函数创建良好,但是当我在字段上的select语句中使用该函数给我提供基于枯萎率的汇率时,该地区为UK / UAE / JAP等

我收到以下错误:

  

信息8115,第16级,状态8,第2行
  将int转换为数值数据类型的算术溢出错误。

逻辑很好,请问如何获取数据类型?

选择语句以使用该功能

SELECT RegionCode
      ,VALUE
     ,[dbo].[fnCurrencyConvertee](RegionCode) * VALUE
  FROM temp.dbo.Treasurey

功能代码-重要提示,以下代码现已正确且可以正常工作,感谢大家的贡献

USE [temp]
GO

CREATE FUNCTION [dbo].[zsCurrencyConvertee] 
     (@inPutRegionCode_column VARCHAR(5))
RETURNS DECIMAL(38,2)
AS
BEGIN
    DECLARE @Convert DECIMAL(20,2)
    DECLARE @Default DECIMAL(20,2) --Default currency is £,

    DECLARE @UK DECIMAL(20,2)
    DECLARE @TURK DECIMAL(20,2) --TURKEY
    DECLARE @AFG DECIMAL(20,2)
    DECLARE @MEX DECIMAL(20,2) --MEXICO
    DECLARE @MOR DECIMAL(20,2) --MOROCCO
    DECLARE @UAE DECIMAL(20,2)
    DECLARE @IRA DECIMAL(38,2) --IRAQ
    DECLARE @JAP DECIMAL(20,2)
    DECLARE @CHI DECIMAL(20,2)

    SET @Convert = 0.00 --Variable which will be reused to hold converted values
    SET @Default = 1.00 --Reset this value if the conversion is required between other currencies such as UAE to JAPANESE etc

    SET @UK = 1
    SET @TURK = 6.87
    SET @AFG = 97.58
    SET @MEX = 24.69
    SET @MOR = 12.31
    SET @UAE = 4.73
    SET @IRA = 1536.43
    SET @JAP = 141.15
    SET @CHI = 8.75

    BEGIN
            IF(@inPutRegionCode_column = 'UK')
            BEGIN
                SET @Convert = @Default / @UK
            END
            ELSE IF(@inPutRegionCode_column = 'TURK')
            BEGIN
                SET @Convert = @Default / @TURK
            END
            ELSE IF(@inPutRegionCode_column = 'AFG')
            BEGIN
                SET @Convert = @Default / @AFG
            END
            ELSE IF(@inPutRegionCode_column = 'MEX')
            BEGIN
                SET @Convert = @Default / @MEX
            END
            ELSE IF(@inPutRegionCode_column = 'MOR')
            BEGIN
                SET @Convert = @Default / @MOR
            END
            ELSE IF(@inPutRegionCode_column = 'UAE')
            BEGIN
                SET @Convert = @Default / @UAE
            END
            ELSE IF(@inPutRegionCode_column = 'IRA')
            BEGIN
                SET @Convert = @Default / @IRA
            END
            ELSE IF(@inPutRegionCode_column = 'JAP')
            BEGIN
                SET @Convert = @Default / @JAP
            END
            ELSE IF(@inPutRegionCode_column = 'CHI')
            BEGIN
                SET @Convert = @Default / @CHI
            END
    END
RETURN
    @Convert
END

]

表格(如果需要)

USE [temp]
GO
CREATE TABLE Treasurey
(
    RegionCode VARCHAR(5),
    Value INT
)

INSERT [dbo].[Treasurey] ([RegionCode], [Value]) VALUES (N'TURK', 23)
INSERT [dbo].[Treasurey] ([RegionCode], [Value]) VALUES (N'AFG', 55)
INSERT [dbo].[Treasurey] ([RegionCode], [Value]) VALUES (N'UK', 33)
INSERT [dbo].[Treasurey] ([RegionCode], [Value]) VALUES (N'MOR', 100)
INSERT [dbo].[Treasurey] ([RegionCode], [Value]) VALUES (N'UAE', 150)
INSERT [dbo].[Treasurey] ([RegionCode], [Value]) VALUES (N'IRA', 200)
INSERT [dbo].[Treasurey] ([RegionCode], [Value]) VALUES (N'JAP', 23)
INSERT [dbo].[Treasurey] ([RegionCode], [Value]) VALUES (N'CHI', 49)

1 个答案:

答案 0 :(得分:3)

您正在使用decimal (2,2),这意味着可以容纳的最大数字为0.99。但是,您正在尝试放入更大的数字。

DECLARE @IRA DECIMAL(2,2) --IRAQ
SET @IRA = 1536.43

使变量声明更大。至少基于此样本数据decimal(6,2) ...但是您可能需要大得多的decimal(38,2),才能说明更大的数字范围。

DECLARE @IRA DECIMAL(6,2) --IRAQ
SET @IRA = 1536.43

有关precision, scale, and length.的更多信息