2017-07-05 3 views
0

Der Versuch, eine gespeicherte Prozedur in SQL 2008R2 zu erstellen. Ich habe zwei Parametereingänge, die abhängig von ihrem Eingang idealerweise den Wert eines anderen Parameters auf einen von vier Werten setzen. Versuchen, festzustellen, ob dies möglich ist, und wenn ja, wo ist der beste Ort, um es in den SP zu setzen. Hier ist eine abgespeckte Version meines Codes.Stored Procedure set Parameter basierend auf anderen Parametern Eingabe

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 

Hoffnung alle w.WearRate mit @Wear zu ersetzen und @Wear zu einem von vier möglichen Feldern in der Ansicht, basierend auf der Kombination der beiden Parameter.

So etwas wie:

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 

Da ich mehr als 150 Zeilen Code haben, die mit dieser Rate beschäftigt, würde ich lieber nicht zu haben, um diesen Code 4 mal zu schreiben, um den gewünschten Wert zu erhalten. Jede Hilfe, wie ich das schreiben und es sauber/einfach halten kann, wäre sehr willkommen.

Antwort

1

Sie können Ihren gesamten Code auf so etwas reduzieren.

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

Das würde die richtige WearRate ziehen, aber nicht zeigen, wie das für die mehrere Zeilen der Berechnungen, die ich mit diesem WearRate verwende, funktionieren würde. Danke für die Eingabe obwohl. – Kerry

0

Die Lösung für mein Problem bestand darin, eine temporäre Tabelle zu erstellen und die WearRate einzufügen, die ich verwenden wollte.

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