2017-07-05 19 views
0

SQL 2008R2でストアドプロシージャを作成しようとしています。 私は2つのパラメータ入力を持っています。入力に応じて、理想的には別のパラメータの値を4つの値のいずれかに設定します。これができるかどうかを判断しようとしています。もしそうなら、どこにSPを置くのが最適な場所か。 ここで私のコードのスリムなダウンバージョンです。他のパラメータ入力に基づくストアドプロシージャセットパラメータ

Declare @FWIdle as bYN, @NewComp as bYN 

set @FW = 'Y'   
set @NEW = 'Y' 

select Case(
when w.WearRate <0.400 then round((- 50*w.WearRate+112.5),2 
when w.WearRate <0.450 then round((-100*w.WearRate+132.5),2) 
when w.WearRate <0.550 then round((- 50*w.WearRate+110.5),2) 
else 52.5 END as Score 

from EMWear w 

@Wearですべてw.WearRateを置き換えるために期待してと二つのパラメータの組み合わせに基づいて、ビュー内の四つの可能な分野の1つに@Wearを設定します。

だから、のようなもの:私はこのレートを扱うコードの150の以上の行を持っているので

if @FW = 'Y' and @NEW = 'N' then @Wear = w.FWRate else 
if @FW = 'N' and @NEW = 'Y' then @Wear = w.NewRate else 
if @FW = 'Y' and @NEW = 'Y' then @Wear = w.FWNewRate else 
@Wear = w.WearRate 

は、私が希望する値を取得するには、このコードを4回記述する必要がないことを好むだろう。どのように私はこれを書くことができ、それをきれいに/シンプルに保つために助けていただければ幸いです。

答えて

1

すべてのコードをこのようにすることができます。

SELECT w.EMCo, w.Component,w.CompType, CASE 
WHEN @FW = 'Y' AND @NEW = 'Y' THEN w.FwIdleWearRate 
WHEN @FW = 'Y' AND @NEW = 'N' THEN w.FwWearRate 
WHEN @FW = 'N' AND @NEW = 'Y' THEN w.IdleWearRate 
ELSE w.StdWearRate 
END AS WearRate 
FROM bcvEMCompWearAdj w 
+0

これは正しいWearRateを取得しますが、そのWearRateで使用する複数行の計算でどのように動作するかはわかりません。 入力していただきありがとうございます。 – Kerry

0

私の問題の解決策は、一時テーブルを作成し、私が使用したいWearRateを挿入することになりました。

If OBJECT_ID('tempdb.dbo.#TempWear','U') IS NOT NULL 
Drop Table #TempWear; 

Create Table #TempWear 
    EMCo tinyint Null, 
    Component varchar(10) NULL, 
    CompType varchar(10) NULL, 
    WearRate decimal(38,5) NULL 
    ); 

if @FW = 'Y' and @New = 'Y' 
Begin 
    Insert into #TempWear 
    (EMCo, Component, CompType, WearRate) 
    select w.EMCo, w.Component,w.CompType, w.FwIdleWearRate 
    from bcvEMCompWearAdj w 
END 
else 
if @FW = 'Y' and @New = 'N' 
Begin 
    Insert into #TempWear 
    (EMCo, Component, CompType, WearRate) 
    select w.EMCo, w.Component,w.CompType, w.FwWearRate 
    from bcvEMCompWearAdj w 
END 
else 
if @FW = 'N' and @New = 'Y' 
Begin 
    Insert into #TempWear 
    (EMCo, Component, CompType, WearRate) 
    sselect w.EMCo, w.Component,w.CompType, w.IdleWearRate 
    from bcvEMCompWearAdj w 
END 
else 
--if @FW = 'N' and @New = 'N' 
Begin 
    Insert into #TempWear 
    (EMCo, Component, CompType, WearRate) 
    select w.EMCo, w.Component,w.CompType, w.StdWearRate  
    from bcvEMCompWearAdj w 
END 
関連する問題