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