2012-03-08 19 views
1

フィールドと演算子としてパルメータの入力に基づいてテーブルを返すプロシージャを作成したい...どのようにパラメータ文字列として渡される演算子の選択を使用できますかSQL Serverの動的クエリのストアドプロシージャ

ALTER PROCEDURE dbo.sp_getStaffRecord 
(
    @deptname varchar(50), 
    @dob date, 
    @active bit, 
    @salary int, 
    @firstname varchar(50), 
    @lastname varchar(50), 
    @OperatorDob varchar(2), 
    @OperatorSalary varchar(2) 
) 
AS 
    select 
     st.id, firstname, lastname, deptname, salary, dob, 
     (select firstname + ', ' + lastname from StaffTable 
     where firstname = @firstname and lastname = @lastname) as [Reporting To], 
     doj, active 
    from 
     StaffTable st 
    inner join 
     DepartmentTable dt on dt.id = st.dept 
    where 
     dt.deptname = @deptname 
     and 
     (
      if (@OperatorDob = '>=') 
       st.dob >= @dob 
      else if (@OperatorDob = '<=') 
       st.dob <= @dob 
      else if (@OperatorDob = '=') 
       st.dob = @dob 
      else if (@OperatorDob = '>') 
       st.dob > @dob 
      else if (@OperatorDob = '<=') 
       st.dob = @dob 
     ) 
    and st.active = @active 
    and st.salary >= @salary 

    RETURN 
+1

これで正しくタグを付けることができます。どのバージョンのSQL Serverを使用していますか? – Yuck

答えて

2

ご希望の方法でIF..ELSEを使用することはできません。その後、クエリはいずれも生成されません@OperatorDob値は('!='など)上で指定のもののいずれかではないことが起こった場合

WHERE 
    dt.deptname = @deptname 
AND 
(
    (@OperatorDob = '>=' AND st.dob >= @dob) 
    OR 
    (@OperatorDob = '<=' AND st.dob <= @dob) 
    OR 
    (@OperatorDob = '=' AND st.dob = @dob) 
    OR 
    (@OperatorDob = '>' AND st.dob > @dob) 
    OR 
    (@OperatorDob = '<=' AND st.dob = @dob) 
) 
AND st.active = @active 
AND st.salary >= @salary 

:何ができることは、それが実行すべきロジックで@OperatorDobの値を組み合わせることです結果。これは望ましい副作用であるかもしれません。

0

動的SQLでこれを行うことはできますが、危険なことです(SQLインジェクションのリスクが高い)。また、ヨーヨーはシンプルCASEにこれらの条件を持つことができるように見えるので、私は、あなたがこのような何かすることをお勧めします:

ALTER PROCEDURE dbo.sp_getStaffRecord 
     (
      @deptname varchar(50), 
      @dob date, 
      @active bit, 
      @salary int, 
      @firstname varchar(50), 
      @lastname varchar(50), 
      @OperatorDob varchar(2), 
      @OperatorSalary varchar(2) 
     ) 
AS 
    select st.id, 
      firstname, 
      lastname, 
      deptname, 
      salary, 
      dob, 
      (select firstname+', '+lastname 
      from StaffTable 
      where firstname = @firstname and lastname = @lastname) 
      as [Reporting To], --Why aren't you just doing @firstname+', '[email protected] 
      doj, 
      active 
    from StaffTable st 
    inner join DeapartmentTable dt 
    on dt.id = st.dept 
    where dt.deptname = @deptname and 
    case when @OperatorDob = '>=' AND st.dob >= @dob THEN 1 
    when @OperatorDob = '<=' AND st.dob <= @dob THEN 1 
    when @OperatorDob = '=' AND st.dob = @dob THEN 1 
    when @OperatorDob = '>' AND st.dob > @dob THEN 1 
    when @OperatorDob = '<=' AND st.dob = @dob THEN 1 ELSE 0 END = 1 
    and st.active = @active 
    and st.salary >= @salary 
+0

thanx sir ....その本当に役立つ... :) –

0

これを試してみてください:

where dt.deptname = @deptname 
     and 
     (@OperatorDob = '>=' AND st.dob >= @dob) OR 
     (@OperatorDob = '=' AND st.dob = @dob) OR 
     (@OperatorDob = '>' AND st.dob > @dob) OR 
     (@OperatorDob = '<=' AND st.dob <= @dob) OR 
     (@OperatorDob = '<' AND st.dob < @dob) OR 

また、あなたはクエリ全体を置くことができますブロックCASE .. WHENブロックに変換します。

関連する問題