Sql 创建一个用户定义的函数?

Sql 创建一个用户定义的函数?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试创建一个用户定义的函数,其中包含两个参数:联邦归档状态字符1,其中包含单身和已婚的S和m等数据;第二个参数是状态字符2,其中已在表EmployeeTransfers中创建数据,其中包含MS、FL、NY等 我创建了一个function,它返回一个数据类型为char1的代码 使用此逻辑示例: 如果州=NY,且 联邦备案单则代码为 或联邦文件(M),则代码为B 等等 因此,我的代码我的返回值为NULL我dnt knw如何设置更具体的返回值 create function dbo.GetSta

我正在尝试创建一个用户定义的函数,其中包含两个参数:联邦归档状态字符1,其中包含单身和已婚的S和m等数据;第二个参数是状态字符2,其中已在表EmployeeTransfers中创建数据,其中包含MS、FL、NY等

我创建了一个function,它返回一个数据类型为char1的代码 使用此逻辑示例: 如果州=NY,且 联邦备案单则代码为 或联邦文件(M),则代码为B

等等

因此,我的代码我的返回值为NULL我dnt knw如何设置更具体的返回值

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

我的返回为空。

您需要在
IF
语句中添加
开始
结束

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
如果开始
SET@code='A'
否则就开始吧
SET@code='B'
结束
返回@code

您需要在
IF
语句中添加
开始
结束

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
如果开始
SET@code='A'
否则就开始吧
SET@code='B'
结束
返回@code

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


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

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


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

if
之后缺少
BEGIN
END
语句,否则SQL将执行,将第一条语句视为在if块内,其余语句视为在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....

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

IF
之后缺少
BEGIN
END
语句,否则SQL将执行将第一条语句视为在IF块内,其余语句则在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....

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

您标记MySQL和SQL Server的原因是什么?您标记MySQL和SQL Server的原因是什么?我同意。不要使用自定义项(除非这是另一个愚蠢的家庭作业问题)。使用表格感谢您的教训,我还注意到了另一个问题,那就是参数的顺序,所以我先修复了write state,然后修复了federalfilligstatus,因为if是相反的顺序,我写入了参数反转的first state和federalfillistatus。我同意。不要使用自定义项(除非这是另一个愚蠢的家庭作业问题)。使用一个表感谢这一课,我还注意到了另一个问题,那就是参数的顺序,所以我先修复了write state,然后修复了federalfilligstatus,因为if的顺序与我写的first state和federalfillistatus的顺序相反,在这一课中,参数是reverseThank,我还注意到了另一个问题,那就是参数的顺序,所以我先修复了write state,然后修复了federalfilligstatus,因为if的顺序是相反的,我写了first state和federalfillistatus,参数是相反的。感谢您的教训,我还注意到了另一个问题,那就是参数的顺序,所以我先修复了write state,然后修复了federalfilligstatus,因为if的顺序是相反的,我写了first state和federalfillistatus,参数是相反的。感谢您的教训,我还注意到另一个问题,就是参数的顺序,所以我先修复了write state,然后修复了federalfilligstatus,因为if的顺序是相反的,我写了first state和federalfillistatus,在本课中,参数是reverseThank,我还注意到了另一个问题,那就是参数的顺序,所以我首先修复了write state,然后修复了federalfilligstatus,因为if的顺序是相反的,我写入了参数是相反的first state和federalfillistatus