0

変更しようとしているユーザー定義関数を継承しましたが、問題があります。それを通常のクエリに変更してからビューにしたいと思います。関数は ufn_B2H_Enrolled_Clients_List です。 この関数は、選択した期間中にプログラムに登録されたクライアントのリストを取得します。ufn_B2H_Enrolled_Clients_List内 には関数ufn_B2H_STATUSES_THROUGH_DTがあります。これにより、選択した時間範囲中にクライアントが持っていた最大のステータス変更が選択されるため、クライアントが登録されてから登録解除され、再度登録された場合、関数はそれらをカウントに機能させません。

私が望むのは、ufn_B2H_Enrolled_Clients_List を取得して、次のような出力を持つ通常のクエリ/ビューに変換することです。

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
4

1 に答える 1

0

関数にはパラメーターがあるため、次のようdbo.ufn_B2H_Enrolled_Clients_Listにインラインに変換できます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

インラインUDFは、パラメーターを持つビューです。

インライン関数を使用して、パラメーター化されたビューの機能を実現できます。

参考文献: http://technet.microsoft.com/en-us/library/aa214762(v=sql.80).aspx

于 2013-08-16T20:02:57.537 に答える