2011-12-27 3 views
1

мой запрос:
Невозможно обновить с условием, где

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 
         IsDefault[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. –

2

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

См. Ответ Mattens для образца.

+0

Это должен быть комментарий к ответу Маттен – gbn

0

Вы можете также использовать Гот с этикетками:


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, процедура будет выполнять два обновления, в противном случае просто один.

Смежные вопросы