2017-01-04 5 views
1

私のデータベースには、Employeeテーブルから従業員の詳細を自分のアプリケーションに戻すためのストアドプロシージャがあります。さまざまなシナリオで従業員レコードを取得する方法

SPHR_Employee_Get(@P_PK INT,@P_ACTIVE TINYINT) 

Employeeテーブル構造がEMP_ACTIVEため

EMP_PK INT, EMP_NAME NVARCHAR(200), EMP_ACTIVE TINYINT 

値です:0 =アクティブ/非1 =アクティブ

私の要件は次のとおりです。私は次のシナリオでは、従業員(複数可)を取得する必要があります同じ手順を使用します。

  1. 全従業員
  2. 人の
  3. すべての現役従業員(EMP_ACTIVE = 1
  4. のみ特定の従業員(EMP_PK = @P_PK
  5. すべての非アクティブな従業員(EMP_ACTIVE = 0
  6. すべての現役従業員+ EMP_PK = @P_PKだ特定の従業員(その@P_PKの従業員が非アクティブであっても)が、重複レコードはありません。

私の問題は、ストアドプロシージャのシグネチャを変更できないことです(申し訳ありませんが、ここで理由を説明できません)。つまり、ストアドプロシージャのパラメータとデータ型を変更/追加できません。 /テーブル。しかし、私はストアドプロシージャのボディ/クエリの部分を変更することができます。

私は、これは

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

のような簡単な選択クエリかもしれ知っているが、どのように私はここWHERE状態を管理することができますか?上記の5つのシナリオで、アプリケーションから既存のストアドプロシージャのパラメータに渡すことができる値は何ですか?

注:EMP_ACTIVE列には、0と(0:無効/有効:1)のみが含まれます。私のアプリケーションでは、私はすべての従業員やすべてのアクティブ/非アクティブな従業員などをロードする必要があるこのすべてのシナリオを適用する場所を知っていますが、私はこれを達成する必要がある既存のストアドプロシージャだけ、私はできませんストアドプロシージャに追加のパラメータを追加します。

答えて

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 

値を編集し送信することによって、それを実行したいものである:第五シナリオのコメントから

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 

と実行が@Shakeerからいくつかの研究と提案した後

--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

良いですが、ここでは5番目のシナリオでは、ストアドプロシージャを2回呼び出す必要があります。 –

+0

はい、1回の呼び出しでそれをしたい場合は、別の方法で体を変更する必要があります。それは複雑な動的コーディングが必要です@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つのシナリオすべてを処理するために、この2つのパラメータしかありません。私はこの5つのシナリオを処理すると思う、私はその2つのパラメータでいくつかの値(いくつかの並べ替えの組み合わせかもしれない)を渡す必要があり、選択クエリのwhere句でそれを処理します。 –

1

になりますMirzaは、簡単なクエリですべてのシナリオを解決しました。シナリオの

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 
関連する問題