2011-12-27 59 views
1

我的查询是更新:
无法与WHERE条件

CREATE PROCEDURE [dbo].[usp_UpdateMenu] 
@MenuName VARCHAR(100), 
@MenuType VARCHAR(50), 
@IsDefault BIT, 
@PortalID INT, 
@MenuID INT 
AS 
BEGIN 
    IF(@IsDefault = 1) 
      BEGIN 
       UPDATE [dbo].[MENU] set IsDefault = 0 where IsDefault= 1 and [email protected], 
         MenuName [email protected], 
         [email protected] 
         MenuType = @MenuType where [email protected] 

      END 
    ELSE 
      BEGIN 
        UPDATE [dbo].[MENU] set 
         MenuName [email protected], 
         [email protected] 
         MenuType = @MenuType 
         where [email protected] 
      END 


END 
SET ANSI_NULLS ON 

其唯一procedure.I的一部分知道where条件不使用两次,就像我想try.But无法处理situation.Thanks 。

回答

1

我认为你正在寻找这样的:

CREATE PROCEDURE [dbo].[usp_UpdateMenu] 
@MenuName VARCHAR(100), 
@MenuType VARCHAR(50), 
@IsDefault BIT, 
@PortalID INT, 
@MenuID INT 
AS 
BEGIN 

    UPDATE [dbo].[MENU] SET 
    MenuName = @MenuName, 
    IsDefault= CASE WHEN PortalID = @PortalID THEN 0 ELSE @IsDefault END, 
    MenuType = @MenuType 
    WHERE [email protected] 

END 

它会的IsDefault值设置为0如果PortalID = @PortalID否则IsDefault会有参数@IsDefault的价值。

2

此查询格式不正确。尝试

UPDATE [dbo].[MENU] 
set IsDefault = 0 
WHERE IsDefault= 1 
    and [email protected] 
    and MenuName [email protected] 
-- and [email protected] 
    and MenuType = @MenuType 
    and [email protected] 

,并提供更新的问题对齐:

BEGIN 
    IF(@IsDefault = 1) 
      BEGIN 
       UPDATE [dbo].[MENU] set IsDefault = 0 
        where IsDefault= 1 and 
         [email protected] and 
         MenuName [email protected] and 
         [email protected] and 
         MenuType = @MenuType and 
         [email protected] 

      END 
    ELSE 
      BEGIN 
        UPDATE [dbo].[MENU] set 
         MenuName [email protected], 
         [email protected], 
         MenuType = @MenuType 
         where [email protected] 
      END 


END 
+0

我的整个情况是根据上面的。我修改我的问题PLZ建议。 – 2011-12-27 10:08:18

2

你不能有multipe WHERE条款在UPDATE声明。您必须将条件与ANDOR相结合。 ,是无效的运算符来组合它们。

请参阅Mattens答案样本。

+0

这应该是对马腾答案的评论 – gbn 2011-12-27 10:22:52

0

您还可以使用goto语句与标签:


CREATE PROCEDURE [dbo].[usp_UpdateMenu] 
@MenuName VARCHAR(100), 
@MenuType VARCHAR(50), 
@IsDefault BIT, 
@PortalID INT, 
@MenuID INT 
AS 

IF @IsDefault = 1 GOTO Update2 

-------- 
Update1: 
-------- 
UPDATE [dbo].[MENU] 
SET 
MenuName [email protected],       
MenuType = @MenuType       
where [email protected]    

GOTO EndProcessing 

-------- 
Update2: 
-------- 
UPDATE [dbo].[MENU] 
SET 
IsDefault = 0 
MenuName [email protected],       
MenuType = @MenuType       
where [email protected]    
and [email protected] 

-------------- 
EndProcessing: 
-------------- 

SET ANSINULLS ON 


0

我最好的阅读是:

  • 如果特定产品将被设置为默认,重置属性当前默认项目;

  • 之后,继续进行指定项目的更新。

所以......

CREATE PROCEDURE [dbo].[usp_UpdateMenu] 
    @MenuName VARCHAR(100), 
    @MenuType VARCHAR(50), 
    @IsDefault BIT, 
    @PortalID INT, 
    @MenuID INT 
AS 
BEGIN 
    IF (@IsDefault = 1) 
    UPDATE [dbo].[MENU] 
    SET IsDefault = 0 
    WHERE IsDefault= 1 
     AND [email protected] 
    ; 
    UPDATE [dbo].[MENU] 
    SET 
    MenuName = @MenuName, 
    IsDefault = @IsDefault 
    MenuType = @MenuType 
    WHERE MenuID = @MenuID 
    ; 
END 

因此,如果您指定1作为@IsDefault值,程序将进行两次更新,否则只有一个。