2014-01-13 31 views
1

我想用開關的情況下開關罩2012

這裏做多個更新表在SQL Server 2012是我的查詢

CREATE PROCEDURE deactivateRecord 
    @paraTableName varchar(15), 
    @paraID int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    select 
     case @paraTableName when 'UserMaster' then update UserMaster set IsActive=1 where [email protected] 
    case @paraTableName when 'GroupMaster' then update GroupMaster set IsActive=1 where [email protected] 


END 
GO 

我要去哪裏錯了?幫幫我 。

+1

你離開結束。 case @paraTableName'UserMaster'然後更新UserMaster set IsActive = 1其中UserID = @ paraID END – PeterRing

+0

@PeterRing,添加END子句是不夠的,因爲在SELECT語句中不可能有UPDATE語句。請參閱下面的答案。 – Dan

+1

T-SQL中的'CASE'不是設計用來處理程序流 - 而是使用'IF'。 'CASE'是一個**表達式**,可以返回一個或另一個原子值 - 但它**不能**包含代碼塊 –

回答

2

在特定情況下解決後,您是否嘗試讀出代碼?例如,如果@paraTableName ='UserMaster',您的代碼將像這樣解析(忽略您的CASE語句沒有END子句,並且T-SQL中的CASE語句不能包含代碼塊 - 只有原子值) :

select update UserMaster set IsActive=1 where [email protected] 

這顯然是沒有意義的,因爲你不能有一個SELECT語句中的UPDATE聲明。

既然你是一個存儲過程中,重寫代碼,以這樣的事情,而不是:

IF @paraTableName = 'UserMaster' 
    update UserMaster set IsActive=1 where [email protected] 
IF @paraTableName = 'GroupMaster' 
    update GroupMaster set IsActive=1 where [email protected] 
+0

+1 - 很好的答案。 – Devart

4

嘗試這一個 -

CREATE PROCEDURE deactivateRecord 

    @paraTableName varchar(15), 
    @paraID int 

AS BEGIN 

    SET NOCOUNT ON; 

    UPDATE dbo.UserMaster 
    SET IsActive = 1 
    WHERE UserID = @paraID 
     AND @paraTableName = 'UserMaster' 

    UPDATE dbo.GroupMaster 
    SET IsActive = 1 
    WHERE GRoupID = @paraID 
     AND @paraTableName = 'GroupMaster' 

END 
GO