2017-11-28 6 views
0

スカラー関数を使用するよりも外側の適用で自分のビューを変更します。例えば外部適用SQLで変数を設定する方法は?

:上記外側で

CREATE VIEW [bjs].[udv_SIR_SUMMARY_PERFTEST] 
AS 
    SELECT 
     dimsite.[SiteCode] , 
     dimsite.[SiteName] , 
     .... 
    LEFT JOIN.. 
    OUTER APPLY 
     ( -- convert from udf_BJs_GENERAL 
     SELECT 
      LeakCheck = CASE 
          WHEN (SUM(GallonsPumped)/100) + 130 > ABS(SUM(DailyVar))     
           THEN 'PASS' 
           ELSE 'FAIL' 
         END 
     FROM  
      [bjs].udv_DailySiraData x 
     WHERE 
      x.TankSystemId = ts.LegTankSystemId 
      AND Date <= MAX(x.DATE) 
      AND Date >= DATEADD(mm, DATEDIFF(mm,0,@ReportDate), 0)) GE 

私は@ReportDate変数を設定する必要が当てはまります。私はその変数を以下のように私の関数にセットしました。

どうすれば外側に適用することができますか?

CREATE FUNCTION [dbo].[udf_BJs_GENERAL] 
    (@TankSystemId INT, 
    @TimeStamp DATETIME2(7)) 
RETURNS VARCHAR(10) 
AS 
BEGIN 
    SELECT TOP 1 @TimePeriod = Date 
    FROM [bjs].udv_DailySiraData 
    WHERE TankSystemId = @TankSystemId 
    ORDER BY Date DESC 

    SET @ReportDate = @TimePeriod 

    IF (@TimeStamp <= @TimePeriod) 
     SET @ReportDate = @TimeStamp 

EDIT

CREATE FUNCTION [dbo].[udf_BJs_GENERAL] 
    (
     @TankSystemId int, 
     @TimeStamp datetime2(7) 
    ) 
RETURNS varchar(10) 
AS 
BEGIN 
    DECLARE @leakChk varchar(10); 
    DECLARE @allowableVariance float; 
    DECLARE @GallonsPumped int; 
    DECLARE @DailyOverOrShort float; 
    DECLARE @TimePeriod datetime2(7); 
    DECLARE @ReportDate datetime2(7) 

    SELECT TOP 1 @TimePeriod = Date FROM [bjs].udv_DailySiraData where [email protected] ORDER BY Date DESC 

    SET @[email protected] 
    IF(@TimeStamp <= @TimePeriod) 
     SET @[email protected] 

    SELECT @GallonsPumped = SUM(GallonsPumped) FROM [bjs].[udv_DailySiraData] where [email protected] and Date <[email protected] and Date >= DATEADD(mm, DATEDIFF(mm,0,@ReportDate), 0) 
    SELECT @DailyOverOrShort = SUM(DailyVar) FROM [bjs].[udv_DailySiraData] where [email protected] and Date <[email protected] and Date >= DATEADD(mm, DATEDIFF(mm,0,@ReportDate), 0) 

    SELECT @allowableVariance= (@GallonsPumped/100) + 130 

    SET @leakChk='FAIL' 
    IF (@allowableVariance > ABS(@DailyOverOrShort)) 
     SET @leakChk = 'PASS'; 

    RETURN @leakChk; 
END; 



GO 
+2

SQL Serverでは、変数を設定して結果セットを返すことはできません。 –

答えて

0

あなたは、外での任意の集合演算は、クエリを適用することはできませんが、これに代えて、あなたはこのようにサブクエリを使用することができます。

CREATE view [bjs].[udv_SIR_SUMMARY_PERFTEST] 
AS 
SELECT dimsite.[SiteCode] , 
    dimsite.[SiteName] , 
.... 
LEFT JOIN.. 
OUTER APPLY (SELECT ReportDate = MAX(Date) FROM [bjs].udv_DailySiraData where TankSystemId=ts.LegTankSystemId) TM 
OUTER APPLY (-- convert from udf_BJs_GENERAL 

    SELECT LeakCheck = CASE WHEN (((SUM(x.GallonsPumped)/100) + 130) > ABS(SUM(x.DailyVar))) THEN 'PASS' ELSE 'FAIL' END 
    FROM [bjs].[udv_DailySiraData] x 
    WHERE x.TankSystemId=ts.LegTankSystemId 
     and x.Date <=TM.ReportDate 
     and x.Date >= CAST(DATEADD(DAY, 1-DAY(TM.ReportDate), TM.ReportDate) AS DATE) 
)GE 
+0

私がこのようにすると、// HAVING句または選択リストに含まれるサブクエリにあり、集約されている列が外部参照でない限り、WHERE句に集計が表示されないことがあります。//エラー – Ratha

+0

It 'とDate <= MAX(x.DATE) '行のために例外が発生します。どのテーブル「日付」から来たのですか?なぜこの述語を作っているのですか?クエリの目的を記述すると、私は別のアプローチを提供することができます。 –

+0

私の本当の問題は、ビューのパフォーマンスを低下させる4つのスカラー関数があることです。だから、スカラー関数の代わりに外部適用をしようとしている。私はそれがビューのパフォーマンスを向上させることを知る必要があります。私の元々の機能を私の質問に入れました(編集セクション) – Ratha

関連する問題