簡體   English   中英

使用確定列的CASE語句創建存儲過程

[英]Creating Stored Procedure with CASE statement that determine the column

我已經存儲了包含CASE語句的過程。 但是,我需要根據我的參數選擇該參數,該參數定義列而不是值。

那可能嗎?

這是我嘗試過的:

CREATE PROCEDURE HR.GetRequestByPriv
    @colKey VARCHAR(50)
AS
    DECLARE @empName VARCHAR(100)

    SELECT       
       @empName = (HR.EmployeeRec.fname  + ' ' + HR.EmployeeRec.lname)
    FROM            
       HR.LeaveRec 
    INNER JOIN
       HR.EmployeeRec ON HR.LeaveRec.EmployeeRecNo = HR.EmployeeRec.recno
    WHERE
        CASE
            WHEN @colKey = 'isApprove' THEN HR.LeaveRec.isApprove
            WHEN @colKey = 'isNote' THEN HR.LeaveRec.isNote
            WHEN @colKey = 'isVerify' THEN HR.LeaveRec.isVerify
        END = 0

    RETURN @empName

希望能為您提供幫助。 謝謝。

您選擇必須為零的列的代碼部分看起來不錯。

但是存儲過程的返回值始終是整數。 所以這行不通:

create procedure dbo.YourSP
as
declare @var varchar(50)
select @var = 'Oops this won''t work'
return @var -- Since @var is not an integer, this won't work as expected

通常的方法是返回行集。 任何不分配變量的select都將返回一個行集。 例如:

create procedure dbo.YourSP
as
select 'Returning a rowset'

另一個選項是輸出參數:

create procedure dbo.YourSP
    @var varchar(50) output
as
select @var = 'Returning an output parameter'

我糊塗了。 您說您想要一個存儲過程,但是您要返回一些東西。 Andomar有一個解決方案,它是輸出參數。 我懷疑您確實想要一個功能。 在這種情況下,您可以創建一個單語句表值函數,該函數很像帶有參數的視圖:

CREATE FUNCTION HR.GetRequestByPriv (
    @colKey VARCHAR(50)
)
RETURNS TABLE as
RETURN(SELECT (l.fname  + ' ' + l.lname) as EmpName
       FROM HR.LeaveRec l NNER JOIN
            HR.EmployeeRec e
            ON l.EmployeeRecNo = e.recno
       WHERE (@colKey = 'isApprove' AND HR.LeaveRec.isApprove = 0) OR
             (@colKey = 'isNote' AND HR.LeaveRec.isNote = 0) OR
             (@colKey = 'isVerify' AND HR.LeaveRec.isVerify)
      );

然后,可以在select語句中將其稱為:

select *
from HR.GetRequestByPriv('isNote');

這種小程序的最簡單方法是使用IF 在3個IF / ELSE塊中使用3個不同的SELECT語句,僅此而已。 像這樣:

IF @colKey = 'isApprove' 
    SELECT       @empName = (HR.EmployeeRec.fname  + ' ' + HR.EmployeeRec.lname)
    FROM  HR.LeaveRec INNER JOIN HR.EmployeeRec ON HR.LeaveRec.EmployeeRecNo = HR.EmployeeRec.recno
    WHERE HR.LeaveRec.isApprove = 0
ELSE
    BEGIN
        IF @colKey = 'isNote'
           SELECT       @empName = (HR.EmployeeRec.fname  + ' ' + HR.EmployeeRec.lname)
           FROM  HR.LeaveRec INNER JOIN HR.EmployeeRec ON HR.LeaveRec.EmployeeRecNo = HR.EmployeeRec.recno
            WHERE HR.LeaveRec.isNote = 0
        ELSE
            ...
    END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM