2017-01-04 54 views
1

我在我的數據庫中有一個存儲過程,以將Employee表中的員工詳細信息返回到我的應用程序。如何在不同情況下獲取員工記錄

SPHR_Employee_Get(@P_PK INT,@P_ACTIVE TINYINT) 

Employee表結構

EMP_PK INT, EMP_NAME NVARCHAR(200), EMP_ACTIVE TINYINT 

EMP_ACTIVE:0 =無/ 1 =活動

我的要求是:我需要在下列情況下的員工(S) ,使用相同的程序:

  1. 所有員工
  2. 所有在職員工(EMP_ACTIVE = 1
  3. 所有非活動的員工(EMP_ACTIVE = 0
  4. 只有特定僱員(EMP_PK = @P_PK
  5. 所有在職員工+特定僱員誰的EMP_PK = @P_PK(即使@P_PK員工是無效的),但沒有重複記錄。

我的問題是,我無法更改存儲過程的簽名(對不起,我無法在這裏解釋原因),這意味着我不能在存儲過程中更改/添加參數和數據類型/表。但是我可以更改存儲過程的正文/查詢部分。

我知道這可能是像

SELECT EMP_PK, EMP_NAME 
FROM EMPLOYEE 
WHERE ?1 AND/OR ?2 

但我怎麼可以在這裏管理WHERE條件的簡單選擇查詢?在上述5種情況下,我可以從我的應用程序傳遞給現有存儲過程參數的值是多少?

注意:EMP_ACTIVE列僅包含01(0:InActive/1:Active)。在我的應用程序中,我知道我要在哪裏應用所有這些場景,也就是我需要加載所有員工或所有活動/非活動員工等的位置。但是,我只需要使用現有存儲過程來實現此目的,但我無法向存儲過程添加一個附加參數。

回答

1

這是你想要

ALTER SPHR_Employee_Get(@P_PK INT,@P_ACTIVE TINYINT) 
AS 
BEGIN 
    SELECT EMP_PK, EMP_NAME 
    FROM EMPLOYEE 
    WHERE (EMP_PK = @P_PK OR @P_PK = -1); 
     AND (EMP_ACTIVE = @P_ACTIVE OR @P_ACTIVE = -1) 
END 

什麼現在通過發送不同的PARAM執行它值

-- All Employees 
EXEC SPHR_Employee_Get -1, -1 

-- All Active Employees 
EXEC SPHR_Employee_Get -1, 1 

-- All Inactive Employees 
EXEC SPHR_Employee_Get -1, 0 

-- Only a particular employee (EMP_PK = @P_PK) 
EXEC SPHR_Employee_Get 123, -1 

/* 
All Active Employees 
+ a Particular employee who's EMP_PK = @P_PK (even if that @P_PK employee is inactive) 
- But no duplicate records. 
*/ 
EXEC SPHR_Employee_Get -1, 1 

EXEC SPHR_Employee_Get 123, -1 

編輯:從5情景意見

ALTER SPHR_Employee_Get(@P_PK INT, @P_ACTIVE TINYINT) 
AS 
BEGIN 
    IF (@P_ACTIVE <> -2) 
    BEGIN 
     SELECT EMP_PK, EMP_NAME 
     FROM EMPLOYEE 
     WHERE (EMP_PK = @P_PK OR @P_PK = -1); 
      AND (EMP_ACTIVE = @P_ACTIVE OR @P_ACTIVE = -1) 
    END 

    IF (@P_ACTIVE = -2) 
    BEGIN 
     SELECT EMP_PK, EMP_NAME 
     FROM EMPLOYEE 
     WHERE EMP_ACTIVE = 1 
     UNION 
     SELECT EMP_PK, EMP_NAME 
     FROM EMPLOYEE 
     WHERE EMP_PK = @P_PK 
    END 
END 

,並呼籲將

EXEC SPHR_Employee_Get 123, -2 

編輯2:問題與TINYINT數據類型

CREATE PROCEDURE SPHR_Employee_Get(@P_PK INT, @P_ACTIVE TINYINT) 
AS 
BEGIN 
    /* 
     @P_ACTIVE VALUES in Different executions 
     --1 All Employees 
     --2 All Active Employees 
     --3 All Inactive Employees 
     --4 Only a particular employee (EMP_PK = @P_PK) 
     --5 All Active Employees 
+ a Particular employee who's EMP_PK = @P_PK (even if that @P_PK employee is inactive) 
- But no duplicate records. 

    */ 

    SELECT EMP_NBR, FIRST_NME 
    FROM EMPLOYEEPROFILE 
    WHERE ((@P_ACTIVE = 1) 
    OR (@P_ACTIVE=2 AND ACTIVE_IND=1) 
    OR (@P_ACTIVE=3 AND ACTIVE_IND=0) 
    OR (@P_ACTIVE=4 AND [email protected]_PK) 
    OR (@P_ACTIVE=5 AND ACTIVE_IND=1) 
    ) 

    UNION 

    SELECT EMP_NBR, FIRST_NME 
    FROM EMPLOYEEPROFILE 
    WHERE @P_ACTIVE=5 AND [email protected]_PK 

END 

和執行將是

--1 All Employees 

EXEC SPHR_Employee_Get NULL,1 

--2 All Active Employees 

EXEC SPHR_Employee_Get NULL,2 

--3 All Inactive Employees 

EXEC SPHR_Employee_Get NULL,3 

--4 Only a particular employee (EMP_PK = @P_PK) 

EXEC SPHR_Employee_Get 123,4 

--5 All Active Employees + Passed Emp(Active/Inactive) 

EXEC SPHR_Employee_Get 123,5 
+0

好,但在第五種情況下,我需要在兩次調用存儲過程,對吧? –

+0

是的,如果你想在一次通話中想要它,你需要以另一種方式改變身體。這是複雜的動態編碼需要@AbdulRasheed –

+0

謝謝你的寶貴建議,從我+1。到目前爲止,這個答案是最好的,我正在等待一個簡單的腳本來處理所有這些情況,而不需要任何動態的sql。 –

0

試試這樣簡單在存儲過程中添加一個額外的參數來處理所需的場景。

CREATE PROCEDURE SPHR_Employee_Get 
    @P_PK INT, 
    @P_ACTIVE TINYINT, 
    @P_Flag INT --- Add @P_Flag parameter to handle requested scanerio 
AS 
BEGIN 

IF (@P_Flag = 1) ------- All Employees 
BEGIN 

Select EMP_PK,EMP_NAME, EMP_ACTIVE FROM Employees 

END 
ELSE IF (@P_Flag = 2) ----------- All Active Employees (EMP_ACTIVE = 1) 
BEGIN 

Select EMP_PK,EMP_NAME, EMP_ACTIVE FROM Employees 
Where EMP_ACTIVE = @P_ACTIVE 
END 
ELSE IF (@P_Flag = 3) ------------ All Inactive Employees (EMP_ACTIVE = 0) 
BEGIN 

Select EMP_PK,EMP_NAME, EMP_ACTIVE FROM Employees 
Where EMP_ACTIVE = @P_ACTIVE 
END 
ELSE IF (@P_Flag = 4) -------------- Only a particular employee (EMP_PK = @P_PK) 
BEGIN 

Select EMP_PK,EMP_NAME, EMP_ACTIVE FROM Employees 
Where EMP_PK = @P_PK 
END 
ELSE IF (@P_Flag = 5) ------------ All Active Employees + a Particular employee who's EMP_PK = @P_PK (even if that @P_PK employee is inactive)- But no duplicate records. 
BEGIN 

Select Distinct EMP_PK,EMP_NAME, EMP_ACTIVE FROM Employees 
Where (EMP_PK = @P_PK AND EMP_ACTIVE = 1) OR (EMP_PK = @P_PK AND EMP_ACTIVE = 0) 
END 


END 
+0

我不能添加/更改存儲過程的簽名,我在我的問題已經提到。 –

+0

那麼如何識別在同一存儲過程中執行哪種情況。 –

+0

我需要在上述情況下將記錄返回到我的應用程序,假設在我的應用程序表單中,我想要將所有活動僱員加載到下拉列表中,並將所有非活動員工加載到另一個下拉列表中。我只有這兩個參數來處理所有這5種情況。我認爲要處理這5個場景,我需要在這兩個參數中傳遞一些值(某種組合可能),並在select查詢的where子句中處理這些值。 –

1

經過一番研究,並從@Shakeer的建議米爾扎,用一個簡單的查詢解決了所有的情況。對於場景

SELECT EMP_PK, EMP_NAME 
FROM EMPLOYEES 
WHERE (  EMP_PK  = ISNULL(@P_PK,EMP_PK) 
      OR EMP_ACTIVE = ISNULL(@P_ACTIVE,EMP_ACTIVE) 
     ) 

參數值是:

PK   Active   RETURNS 
-------  -----------  -------- 
-1   NULL   All Records 
-1   1    All Active Records 
-1   0    All Inactive Records 
PK_Value 2(>1)   Record for PK 
PK_Value 1    All active records and the PK value record, 
          even if PK value record is inactive 
相關問題