Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL TVM或年金函数PV、FV、NPER、利率、PMT_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL TVM或年金函数PV、FV、NPER、利率、PMT

SQL TVM或年金函数PV、FV、NPER、利率、PMT,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试收集一些UDF,作为一名优秀的程序员,我更喜欢CRTL+C、CRTL+V方法。而且我的数学成绩不是100%。基本上,我希望模拟excel中的函数:NPER、RATE、PV、FV、PMT,由于某些原因,这些函数很难找到,但我不能相信有人没有它们。我使用的是SQLServer2008,所以如果我有企业或BI,可能会添加它们,这就是为什么没有人要求添加它们的原因。下面是一个我发现似乎对PMT很有效的方法 经过长时间的搜索,感谢Jeff Orris和Lad2025。我得出结论,a CLR是最好

我正在尝试收集一些UDF,作为一名优秀的程序员,我更喜欢CRTL+C、CRTL+V方法。而且我的数学成绩不是100%。基本上,我希望模拟excel中的函数:NPER、RATE、PV、FV、PMT,由于某些原因,这些函数很难找到,但我不能相信有人没有它们。我使用的是SQLServer2008,所以如果我有企业或BI,可能会添加它们,这就是为什么没有人要求添加它们的原因。下面是一个我发现似乎对PMT很有效的方法


经过长时间的搜索,感谢Jeff Orris和Lad2025。我得出结论,a CLR是最好的方法。为了帮助其他SO用户,我现在将发布一些东西

首先。这是CLR的基本VB代码。要安装它,请按照对我的问题的评论进行操作

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server


Partial Public Class ExcelFunctions
    <Microsoft.SqlServer.Server.SqlFunction(IsDeterministic:=True, IsPrecise:=True)> _
    Public Shared Function fPMT(ByVal Rate As Double, ByVal NPer As Double, ByVal PV As Double, Optional ByVal FV As Double = 0, Optional ByVal Type As Byte = 0) As SqlDouble
        Dim PMTS As Double

        If Type = 0 Then
            PMTS = Pmt(Rate, NPer, PV, FV, DueDate.EndOfPeriod)
        ElseIf Type = 1 Then
            PMTS = Pmt(Rate, NPer, PV, FV, DueDate.BegOfPeriod)
        End If

        Return New SqlDouble(PMTS)
    End Function
    <Microsoft.SqlServer.Server.SqlFunction(IsDeterministic:=True, IsPrecise:=True)> _
    Public Shared Function fNPER(ByVal Rate As Double, ByVal PMTS As Double, ByVal PV As Double, Optional ByVal FV As Double = 0, Optional ByVal Type As Byte = 0) As SqlDouble
        Dim NPERS As Double

        If Type = 0 Then
            NPERS = NPer(Rate, PMTS, PV, FV, DueDate.EndOfPeriod)
        ElseIf Type = 1 Then
            NPERS = NPer(Rate, PMTS, PV, FV, DueDate.BegOfPeriod)
        End If

        Return New SqlDouble(NPERS)
    End Function
    <Microsoft.SqlServer.Server.SqlFunction(IsDeterministic:=True, IsPrecise:=True)> _
    Public Shared Function fPV(ByVal Rate As Double, ByVal NPER As Double, ByVal PMTS As Double, Optional ByVal FV As Double = 0, Optional ByVal Type As Byte = 0) As SqlDouble
        Dim PVs As Double

        If Type = 0 Then
            PVs = PV(Rate, NPER, PMTS, FV, DueDate.EndOfPeriod)
        ElseIf Type = 1 Then
            PVs = PV(Rate, NPER, PMTS, FV, DueDate.BegOfPeriod)
        End If

        Return New SqlDouble(PVs)
    End Function
    <Microsoft.SqlServer.Server.SqlFunction(IsDeterministic:=True, IsPrecise:=True)> _
    Public Shared Function fFV(ByVal Rate As Double, ByVal NPER As Double, ByVal PMTS As Double, Optional ByVal PV As Double = 0, Optional ByVal Type As Byte = 0) As SqlDouble
        Dim FVs As Double

        If Type = 0 Then

            FVs = FV(Rate, NPER, PMTS, PV, DueDate.EndOfPeriod)
        ElseIf Type = 1 Then
            FVs = FV(Rate, NPER, PMTS, PV, DueDate.BegOfPeriod)
        End If

        Return New SqlDouble(FVs)
    End Function
    <Microsoft.SqlServer.Server.SqlFunction(IsDeterministic:=True, IsPrecise:=True)> _
    Public Shared Function fRATE(ByVal NPER As Double, ByVal PMTS As Double, Optional ByVal PV As Double = 0, Optional ByVal FV As Double = 0, Optional ByVal Type As Byte = 0) As SqlDouble
        Dim Rates As Double

        If Type = 0 Then

            Rates = Rate(NPER, PMTS, PV, FV, DueDate.EndOfPeriod, 0.01)
        ElseIf Type = 1 Then
            Rates = Rate(NPER, PMTS, PV, FV, DueDate.BegOfPeriod, 0.01)
        End If

        Return New SqlDouble(Rates)
    End Function

End Class

Excel Rate函数完全在sql中实现

create function uf_Financial_RATE
    (@nper int, @pmt float, @pv float, @fv float, @type bit) 
    returns float
as

begin

    declare @maxIterations int, @i int;
    declare @rate float, @y float, @slope float;
    declare @epsilon float, @guess float;
    declare @pow float, @pow1 float;

    -- Test for rate = 0
    select @y = (@pmt * @nper) + @pv + @fv;
    if (@y <= @epsilon and @y >= -@epsilon)
        return 0;

    -- Use Newton method of approximating the root
    select 
        @maxIterations = 20, 
        @epsilon = 0.00001,
        @guess = 0.1

    select @i = 0, @rate = @guess;

    while @i < @maxIterations
        begin

            select 
                @pow = POWER(1 + @rate, @nper),
                @pow1 = POWER(1 + @rate, @nper - 1);

            -- Find y = f(rate) from excel formula
            select @y =
                @pv * @pow +
                @pmt * (1 + @rate * @type) * ((@pow - 1) / @rate) +
                @fv;

            -- Check if precission is reached
            if @y <= @epsilon and @y >= -@epsilon 
                return @rate;

            -- Find slope value ( y' = f'(rate) ) from the derivative of excel formula
            select @slope =
                @pv * @nper * @pow1 +
                @pmt * ((@type * (@pow - 1) / @rate) + (1 + @rate * @type) * (((@rate * @nper * @pow1) - (@pow - 1)) / POWER(@rate, 2)));

            -- New guess rate
            select @rate = 
                -@y / @slope + @rate;

            -- Next iteration
            select @i = @i + 1;
        end

    -- Could not solve
    return -1;
end
看看这个:更好。在生产系统中使用它之前,首先检查它,使用来自未知源的DLL可能是危险的
CREATE ASSEMBLY [CLRExcel_Financial_Functions]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C01040083804F560000000000000000E00002210B010B00000A0000000E000000000000DE29000000200000004000000000400000200000000200000400000000000000040000000000000000A0000000040000000000000200408500001000001000000000100000100000000000001000000000000000000000008C2900004F000000006000008808000000000000000000000000000000000000008000000C000000004000001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000E409000000200000000A000000040000000000000000000000000000200000602E73646174610000C20000000040000000020000000E0000000000000000000000000000400000C02E727372630000008808000000600000000A000000100000000000000000000000000000400000402E72656C6F6300000C0000000080000000020000001A0000000000000000000000000000400000420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0290000000000004800000002000500B0210000DC07000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002602280100000A00002A0000133005003300000001000011000E0416330D0203040516280200000A0B2B100E0417330B0203040517280200000A0B00120207280300000A00080A2B00062A00133005003300000002000011000E0416330D0203040516280400000A0B2B100E0417330B0203040517280400000A0B00120207280300000A00080A2B00062A00133005003300000003000011000E0416330D0203040516280500000A0B2B100E0417330B0203040517280500000A0B00120207280300000A00080A2B00062A00133005003300000004000011000E0416330D0203040516280600000A0B2B100E0417330B0203040517280600000A0B00120207280300000A00080A2B00062A00133006004500000005000011000E041633160203040516237B14AE47E17A843F280700000A0B2B190E041733140203040517237B14AE47E17A843F280700000A0B00120207280300000A00080A2B00062A00000042534A4201000100000000000C00000076322E302E35303732370000000005006C00000050030000237E0000BC030000EC02000023537472696E677300000000A80600000800000023555300B0060000100000002347554944000000C00600001C01000023426C6F620000000000000002000001471D02000900000000FA2533001600000100000013000000020000000600000019000000150000000B000000120000000500000001000000030000000000C80201000000000006005C0055000E008A0075000A00CC0013000A00D60013000600F500E2000E002D01120106004201E2001F00560100000600850165010600A50165010600E201C3010600F001C30106000402550006002C021A02060047021A02060062021A0206007B021A02060094021A020600B1021A020000000001000000000001000100010000002900380005000100010050200000000006186300130001005C200000000016009400170001009C20000000001600AE0017000600DC20000000001600B90017000B001C21000000001600C200170010005C21000000001600C60017001500000001009900000002009E0000000300A30010100400A60010100500A90000000100990000000200B40000000300A30010100400A60010100500A90000000100990000000200BD0000000300B40010100400A60010100500A90000000100990000000200BD0000000300B40010100400A30010100500A90000000100BD0000000200B40010100300A30010100400A60010100500A9000900630013001900DE002C0011006300360019009E002C001900A3002C001900A6002C00190099004300290063001300310063001300390063007800490063007E005100630013005900630083006100630088006900630088007100630083007900630083008100630083008900630083009100630083009900630083000D0011002100050015002A000D0025002100050029002A000D003900210005003D002A000D004D002100050051002A000D005D0021000D0061002100050065002A00200043004E002E0063009F002E006B00BE002E007300E8002E00A300E8002E0053008D002E005B0096002E008300E8002E009B00E8002E007B00EE002E00AB000C012E008B00F4002E0093000C0140004B00530060004B00530080004B005300A0004B005300C0004B0053003B003B003B003B003B000480000001000000AA1620550000000000003800000002000000000000000000000001000A00000000000800000000000000000000000A0013000000000002000000000000000000000001006900000000000000003C4D6F64756C653E006D73636F726C6962004D6963726F736F66742E56697375616C426173696300457863656C46756E6374696F6E7300434C52457863656C5F46696E616E6369616C5F46756E6374696F6E730053797374656D004F626A656374002E63746F720053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C446F75626C650066504D540052617465004E506572005056004656005479706500664E50455200504D545300665056004E504552006646560066524154450046696E616E6369616C004475654461746500506D740053797374656D2E446961676E6F73746963730044656275676765724E6F6E55736572436F6465417474726962757465004D6963726F736F66742E53716C5365727665722E5365727665720053716C46756E6374696F6E4174747269627574650044656275676761626C6541747472696275746500446562756767696E674D6F6465730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053797374656D2E52756E74696D652E496E7465726F705365727669636573004775696441747472696275746500436F6D56697369626C6541747472696275746500434C53436F6D706C69616E744174747269627574650053797374656D2E5265666C656374696F6E00417373656D626C7954726164656D61726B41747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C795469746C6541747472696275746500434C52457863656C5F46696E616E6369616C5F46756E6374696F6E732E646C6C000000000003200000000000FE06D9D2A5500340965A8DA858E6528E0008B77A5C561934E08908B03F5F7F11D50A3A0320000109000511090D0D0D0D0508000000000000000001000900050D0D0D0D0D1111042001010D07070311090D11090A00060D0D0D0D0D11110D0401000000240100020054020F497344657465726D696E697374696301540209497350726563697365010520010111210420010108042001010E04200101020801000301000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773012901002430303830613839312D323563642D343434332D393236662D663332666532333635666536000005010000000005010001000017010012436F7079726967687420C2A920203230313300000F01000A434C52457863656C46560000B42900000000000000000000CE290000002000000000000000000000000000000000000000000000C0290000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500204000000000000000000000000000000000000000000000000000000000000000000083804F560000000002000000A60000001C4000001C0E000052534453BEBCC0A2671A8841903983FBE9D679E401000000433A5C55736572735C50545265686D5C446F63756D656E74735C5446535C57696E646F77735F417070735C434C52457863656C5F46696E616E6369616C5F46756E6374696F6E5C434C52457863656C5F46696E616E6369616C5F46756E6374696F6E5C6F626A5C44656275675C434C52457863656C5F46696E616E6369616C5F46756E6374696F6E732E706462000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030003000000280000800E000000480000801000000060000080000000000000000000000000000002000200000078000080030000009000008000000000000000000000000000000100007F0000A80000800000000000000000000000000000010001000000C00000800000000000000000000000000000010000000000D80000000000000000000000000000000000010000000000E80000000000000000000000000000000000010000000000F800000000000000000000000000000000000100000000000801000050640000E80200000000000000000000386700002801000000000000000000006068000022000000000000000000000018610000380300000000000000000000380334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001002055AA16000001002055AA163F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00498020000010053007400720069006E006700460069006C00650049006E0066006F00000074020000010030003000300030003000340062003000000040000B000100460069006C0065004400650073006300720069007000740069006F006E000000000043004C00520045007800630065006C00460056000000000040000F000100460069006C006500560065007200730069006F006E000000000031002E0030002E0035003800300032002E00320031003700390032000000000064002100010049006E007400650072006E0061006C004E0061006D006500000043004C00520045007800630065006C005F00460069006E0061006E006300690061006C005F00460075006E006300740069006F006E0073002E0064006C006C00000000004800120001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020002000320030003100330000006C00210001004F0072006900670069006E0061006C00460069006C0065006E0061006D006500000043004C00520045007800630065006C005F00460069006E0061006E006300690061006C005F00460075006E006300740069006F006E0073002E0064006C006C000000000038000B000100500072006F0064007500630074004E0061006D0065000000000043004C00520045007800630065006C00460056000000000044000F000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0035003800300032002E00320031003700390032000000000048000F00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0035003800300032002E003200310037003900320000000000280000002000000040000000010004000000000080020000000000000000000000000000000000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007777777777777777777777777777700444444444444444444444444444447004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF4700488888888888888888888888888847004444444444444444444444444444470044C4C4C4C4C4C4C4C4C4ECECE49747004CCCCCCCCCCCCCCCCCCCCCCCCCCC40000444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000003C0000007FFFFFFFFFFFFFFFFFFFFFFFF2800000010000000200000000100040000000000C0000000000000000000000000000000000000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000000000000000077777777777777744444444444444474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF84748888888888888474CCCCCCCCCCCCC47C4444444444444C000000000000000000000000000000000FFFF000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000FFFF0000FFFF00000000010002002020100001000400E80200000200101010000100040028010000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000E03900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = SAFE
GO

CREATE FUNCTION [dbo].[fRATE](@NPER [float], @PMTS [float], @PV [float], @FV [float], @Type [tinyint])
RETURNS [float] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [CLRExcel_Financial_Functions].[CLRExcel_Financial_Functions.ExcelFunctions].[fRATE]
GO

CREATE FUNCTION [dbo].[fPV](@Rate [float], @NPER [float], @PMTS [float], @FV [float], @Type [tinyint])
RETURNS [float] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [CLRExcel_Financial_Functions].[CLRExcel_Financial_Functions.ExcelFunctions].[fPV]
GO

CREATE FUNCTION [dbo].[fPMT](@Rate [float], @NPer [float], @PV [float], @FV [float], @Type [tinyint])
RETURNS [float] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [CLRExcel_Financial_Functions].[CLRExcel_Financial_Functions.ExcelFunctions].[fPMT]
GO

CREATE FUNCTION [dbo].[fNPER](@Rate [float], @PMTS [float], @PV [float], @FV [float], @Type [tinyint])
RETURNS [float] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [CLRExcel_Financial_Functions].[CLRExcel_Financial_Functions.ExcelFunctions].[fNPER]
GO

CREATE FUNCTION [dbo].[fFV](@Rate [float], @NPER [float], @PMTS [float], @PV [float], @Type [tinyint])
RETURNS [float] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [CLRExcel_Financial_Functions].[CLRExcel_Financial_Functions.ExcelFunctions].[fFV]
GO
create function uf_Financial_RATE
    (@nper int, @pmt float, @pv float, @fv float, @type bit) 
    returns float
as

begin

    declare @maxIterations int, @i int;
    declare @rate float, @y float, @slope float;
    declare @epsilon float, @guess float;
    declare @pow float, @pow1 float;

    -- Test for rate = 0
    select @y = (@pmt * @nper) + @pv + @fv;
    if (@y <= @epsilon and @y >= -@epsilon)
        return 0;

    -- Use Newton method of approximating the root
    select 
        @maxIterations = 20, 
        @epsilon = 0.00001,
        @guess = 0.1

    select @i = 0, @rate = @guess;

    while @i < @maxIterations
        begin

            select 
                @pow = POWER(1 + @rate, @nper),
                @pow1 = POWER(1 + @rate, @nper - 1);

            -- Find y = f(rate) from excel formula
            select @y =
                @pv * @pow +
                @pmt * (1 + @rate * @type) * ((@pow - 1) / @rate) +
                @fv;

            -- Check if precission is reached
            if @y <= @epsilon and @y >= -@epsilon 
                return @rate;

            -- Find slope value ( y' = f'(rate) ) from the derivative of excel formula
            select @slope =
                @pv * @nper * @pow1 +
                @pmt * ((@type * (@pow - 1) / @rate) + (1 + @rate * @type) * (((@rate * @nper * @pow1) - (@pow - 1)) / POWER(@rate, 2)));

            -- New guess rate
            select @rate = 
                -@y / @slope + @rate;

            -- Next iteration
            select @i = @i + 1;
        end

    -- Could not solve
    return -1;
end