我试图创建一个用户定义的函数,其中包含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
我的回报是空的。
答案 0 :(得分:3)
您的代码在第一次返回时返回,因为它不知道它是if块的一部分。只需删除所有返回并在最后返回一个。
更好的方法是创建一个可以加入的查找表。这样,如果您需要添加归档状态或状态,则只需添加一行即可。如果您需要修改代码,您只需更新表。
答案 1 :(得分:2)
您在BEGIN
之后缺少END
和IF
语句,否则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
语句中添加END
和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