创建用户定义的函数?

时间:2015-11-17 00:10:42

标签: sql sql-server sql-server-2008

我试图创建一个用户定义的函数,其中包含2个参数,联邦归档状态字符为1,其中有S和M等数据是单个和已婚,第二个参数是状态字符2,其中已创建数据在表中EmployeeTransfers有MS,FL,NY等..

我创建了一个functoin,它返回一个数据类型为char 1的代码 用这个逻辑例子: IF State = NY和 联邦归档单(S)然后代码是A. 或联邦提起婚姻(M)然后代码是B

等...

所以我的代码我的返回值为NULL我知道如何设置返回更具体的

create function dbo.GetStateFilingStatus
(
    @federalfilingstatus char(1),
    @state char(2)
) returns char(1)
as
begin
    declare @code char(1) = null

    select @federalfilingstatus = EmpFederalFilingStatus from EmployeeTransfers
    where @state  = EmpTransferState

    if (@state = 'MS' AND @federalfilingstatus = 'S')
    set @code = 'A'
    return @code 

    if (@state = 'MS' AND @federalfilingstatus = 'M')
    set @code = 'M'
    return @code 

    if (@state = 'NJ' AND @federalfilingstatus = 'S')
    set @code = 'B'
    return @code 

    if (@state = 'NJ' AND @federalfilingstatus = 'M')
    set @code = 'A'
    return @code 

    if (@state = 'AZ' AND @federalfilingstatus = 'S')
    set @code = 'A'
    return @code 

    if (@state = 'AZ' AND @federalfilingstatus = 'M')
    set @code = 'B'
    return @code 

    if (@state = 'CT' AND @federalfilingstatus = 'S')
    set @code = 'F'
    return @code 

    if (@state = 'CT' AND @federalfilingstatus = 'M')
    set @code = 'M'
    return @code 

    if (@state = 'DC' AND @federalfilingstatus = 'S')
    set @code = 'S'
    return @code 

    if (@state = 'DC' AND @federalfilingstatus = 'M')
    set @code = 'Y'
    return @code 

end
Go

我尝试用

执行它
select dbo.GetStateFilingStatus(EmpTransferState ,EmpFederalFilingStatus) as StateFilingStatus from EmployeeTransfers

我的回报是空的。

3 个答案:

答案 0 :(得分:3)

您的代码在第一次返回时返回,因为它不知道它是if块的一部分。只需删除所有返回并在最后返回一个。

更好的方法是创建一个可以加入的查找表。这样,如果您需要添加归档状态或状态,则只需添加一行即可。如果您需要修改代码,您只需更新表。

答案 1 :(得分:2)

您在BEGIN之后缺少ENDIF语句,否则SQL将执行将第一个语句视为在IF块内,其余语句在之后。无论如何,你根本不需要在这里使用@code变量,只需直接返回值:

if (@state = 'MS' AND @federalfilingstatus = 'S')
    return 'A' 

if (@state = 'MS' AND @federalfilingstatus = 'M')
    return 'M' 

if (@state = 'NJ' AND @federalfilingstatus = 'S')
    return 'B' 

--etc....

然而,更好的解决方案是使用查找表而不是这个复杂的条件列表。这样你可以添加它,而不必担心维护一个复杂的存储过程。

答案 2 :(得分:1)

您需要在BEGIN语句中添加ENDIF

if (@state = 'MS' AND @federalfilingstatus = 'S') begin
    set @code = 'A'
    return @code 
end

之前发生的事情是,在没有BEGIN - END语句的情况下,RETURN语句在评估第一个IF语句后执行。

或者,您可以使用IF - ELSE IF组合来设置@code的值,并将RETURN语句放在最后。

IF <condition> BEGIN
    SET @code = 'A'
ELSE IF <condition> BEGIN
    SET @code = 'B'    
END

RETURN @code