Невозможно обновить, где условие - PullRequest
1 голос
/ 27 декабря 2011

мой запрос:

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 PortalID=@PortalID,
                        MenuName =@MenuName,
                        IsDefault=@IsDefault
                        MenuType = @MenuType where MenuID=@MenuID

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


END
SET ANSI_NULLS ON

это единственная часть процедуры. Я знаю, что where условие не используется дважды, как я хочу попробовать. Но не могу справиться с ситуацией. Спасибо.

Ответы [ 5 ]

2 голосов
/ 27 декабря 2011

Вы не можете иметь несколько выражений WHERE в операторе UPDATE.Вы должны объединить условия либо с AND, либо с OR., не является допустимым оператором для их объединения.

См. Ответ Mattens для примера.

2 голосов
/ 27 декабря 2011

Этот запрос некорректен. Попробуйте

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

чтобы выровнять свой обновленный вопрос:

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

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


END
1 голос
/ 27 декабря 2011

Я думаю, вы ищете это:

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 MenuID=@MenuID

END

Это установит значение IsDefault в 0, если PortalID = @PortalID в противном случае IsDefault будет иметь значение параметра @IsDefault.

0 голосов
/ 27 декабря 2011

Мое лучшее чтение:

  • , если определенный элемент собирается быть установленным по умолчанию, сбросьте этот атрибут для текущего элемента по умолчанию;

    впоследствии просто продолжите обновление указанного элемента.

Итак ...

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 PortalID=@PortalID
  ;
  UPDATE [dbo].[MENU]
  SET
    MenuName  = @MenuName,
    IsDefault = @IsDefault
    MenuType  = @MenuType
  WHERE MenuID = @MenuID
  ;
END

Итак, если вы указали 1 в качествезначение @IsDefault, процедура будет выполнять два обновления, в противном случае только одно.

0 голосов
/ 27 декабря 2011

Вы также можете использовать 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 =@MenuName,                          
MenuType = @MenuType                         
where MenuID=@MenuID              

GOTO EndProcessing

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

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

SET ANSINULLS ON


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...