Sql server 2008 将用户定义的函数修改为视图
我继承了一个试图修改的用户定义函数,但遇到了一些问题。我想将其修改为常规查询,然后将其转换为视图。该函数是ufn_B2H_注册的客户列表。此函数用于在选定的时间段内提取程序中注册的客户端列表。在ufn_B2H_注册客户_列表中,是ufn_B2H_状态_至_DT的函数。这将选择客户机在所选时间范围内的最大状态更改,因此,如果客户机已注册,然后取消注册,然后再次注册,则函数不将其计入计数 我要做的是将ufn_B2H_已注册客户_列表转换为常规查询/视图,其输出如下所示:Sql server 2008 将用户定义的函数修改为视图,sql-server-2008,user-defined-functions,Sql Server 2008,User Defined Functions,我继承了一个试图修改的用户定义函数,但遇到了一些问题。我想将其修改为常规查询,然后将其转换为视图。该函数是ufn_B2H_注册的客户列表。此函数用于在选定的时间段内提取程序中注册的客户端列表。在ufn_B2H_注册客户_列表中,是ufn_B2H_状态_至_DT的函数。这将选择客户机在所选时间范围内的最大状态更改,因此,如果客户机已注册,然后取消注册,然后再次注册,则函数不将其计入计数 我要做的是将ufn_B2H_已注册客户_列表转换为常规查询/视图,其输出如下所示: Total_Clients_
Total_Clients_Enrolled Month Year
252 1 2013
247 2 2013
303 3 2013
**ufn_B2H_Enrolled_Clients_List Function**
RETURNS varchar(100)
AS
BEGIN
-- Declare the return variable here
DECLARE @VALUE varchar(100)
SELECT @VALUE = VALUE
FROM ENUMS
WHERE NAME = @NAME AND NUMBER = @NUMBER
IF @VALUE IS NULL
SET @VALUE = 'unknown'
RETURN (@VALUE)
END
GO
CREATE FUNCTION [dbo].[ufn_B2H_Enrolled_Clients_List](@From_DT datetime, @To_DT datetime)
RETURNS @retB2H_Enrolled_Clients_List TABLE
(
CLT_NBR int
)
AS
BEGIN
INSERT INTO @retB2H_Enrolled_Clients_List
--Include all clients enrolled prior to the period end date
SELECT CLT_NBR
FROM ECMS.dbo.ufn_B2H_STATUSES_THROUGH_DT(@To_DT) s1
WHERE s1.B2H_STATUS=4 AND s1.Max_Effect_DT <DATEADD(d,1,@To_DT)
--Exclude all clients disenrolled or transferred out prior to the start date
EXCEPT
SELECT s2.CLT_NBR
FROM ECMS.dbo.ufn_B2H_STATUSES_THROUGH_DT(@To_DT) s2 JOIN ECMS.dbo.ufn_B2H_STATUSES_THROUGH_DT(@To_DT) s1 ON s1.CLT_NBR=s2.CLT_NBR
WHERE s2.B2H_STATUS IN (7,9) AND s2.Max_Effect_DT <@From_DT AND s2.Max_Effect_DT>s1.Max_Effect_DT AND s1.B2H_STATUS IN (4,8)
--Exclude all clients who transferred in after the prior end date.
EXCEPT
SELECT s3.CLT_NBR
FROM ECMS.dbo.B2H_STATUS s3 JOIN ECMS.dbo.ufn_B2H_STATUSES_THROUGH_DT(@To_DT) s1 ON s1.CLT_NBR=s3.CLT_NBR
WHERE s3.B2H_STATUS = 8 AND s1.B2H_STATUS IN (4,8) AND s3.EFFECT_DT > @To_DT AND s3.Effect_DT>s1.Max_Effect_DT
RETURN
END
GO
CREATE FUNCTION [dbo].[ufn_B2H_STATUSES_THROUGH_DT](@Through_DT datetime)
RETURNS @retB2H_STATUSES_THROUGH_DT TABLE
(
CLT_NBR int
,B2H_STATUS int
,Max_EFFECT_DT datetime
)
AS
BEGIN
INSERT INTO @retB2H_STATUSES_THROUGH_DT
S
ELECT CLT_NBR
,B2H_STATUS
,MAX(EFFECT_DT) AS Max_Effect_DT
FROM [ECMS].[dbo].[B2H_STATUS]
WHERE EFFECT_DT<DATEADD(d,1,@Through_DT)
GROUP BY CLT_NBR, B2H_STATUS
RETURN
END
GO
由于dbo.ufn_B2H_已注册_Clients_List函数具有参数,因此可以将其转换为内联UDF,因此:
内联UDF是具有以下参数的视图:
内联函数可用于实现
参数化视图
参考资料:
CREATE FUNCTION [dbo].[ufn_B2H_Enrolled_Clients_List](@From_DT datetime, @To_DT datetime)
RETURNS TABLE
AS
RETURN
SELECT CLT_NBR
FROM ECMS.dbo.ufn_B2H_STATUSES_THROUGH_DT(@To_DT) s1
WHERE s1.B2H_STATUS=4 AND s1.Max_Effect_DT <DATEADD(d,1,@To_DT)
--Exclude all clients disenrolled or transferred out prior to the start date
EXCEPT
SELECT s2.CLT_NBR
FROM ECMS.dbo.ufn_B2H_STATUSES_THROUGH_DT(@To_DT) s2 JOIN ECMS.dbo.ufn_B2H_STATUSES_THROUGH_DT(@To_DT) s1 ON s1.CLT_NBR=s2.CLT_NBR
WHERE s2.B2H_STATUS IN (7,9) AND s2.Max_Effect_DT <@From_DT AND s2.Max_Effect_DT>s1.Max_Effect_DT AND s1.B2H_STATUS IN (4,8)
--Exclude all clients who transferred in after the prior end date.
EXCEPT
SELECT s3.CLT_NBR
FROM ECMS.dbo.B2H_STATUS s3 JOIN ECMS.dbo.ufn_B2H_STATUSES_THROUGH_DT(@To_DT) s1 ON s1.CLT_NBR=s3.CLT_NBR
WHERE s3.B2H_STATUS = 8 AND s1.B2H_STATUS IN (4,8) AND s3.EFFECT_DT > @To_DT AND s3.Effect_DT>s1.Max_Effect_DT
GO