Sql 无法使用where条件更新

Sql 无法使用where条件更新,sql,sql-server-2005,Sql,Sql Server 2005,我的问题是: 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

我的问题是:

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

这只是过程的一部分。我知道
中的
条件不会像我想尝试的那样使用两次。但无法处理这种情况。谢谢。

此查询的格式不正确。试一试

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

此查询的格式不正确。试一试

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

UPDATE
语句中不能有多个
WHERE
子句。必须将这些条件与
组合在一起<代码>,
不是组合它们的有效运算符


有关示例,请参见Mattens答案

UPDATE
语句中不能有多个
WHERE
子句。必须将这些条件与
组合在一起<代码>,
不是组合它们的有效运算符


有关示例,请参见Mattens答案

我想你正在寻找这个:

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

如果
PortalID=@PortalID
,它会将
IsDefault
的值设置为
0
,否则
IsDefault
将具有参数值
@IsDefault

,我想您正在寻找这个:

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

如果
PortalID=@PortalID
,它将
IsDefault
的值设置为
0
,否则
IsDefault
将具有参数
@IsDefault

的值。您还可以将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



您还可以将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


我最好的读物是:

  • 如果某个特定项即将设置为默认项,则为当前默认项重置该属性

  • 之后,只需继续更新指定的项目

所以

因此,如果将
1
指定为
@IsDefault
的值,则该过程将执行两次更新,否则只执行一次更新。

我的最佳解读是:

  • 如果某个特定项即将设置为默认项,则为当前默认项重置该属性

  • 之后,只需继续更新指定的项目

所以


因此,如果将
1
指定为
@IsDefault
的值,则该过程将执行两次更新,否则只有一个。

我的整个情况与上面所述一致。我修改了我的问题,请建议。我的整个情况与上面所述一致。我修改了我的问题,请建议。这应该是对Matten答案的评论。这应该是对Matten答案的评论