После удаления вставить значение в SQL Server - PullRequest
0 голосов
/ 09 ноября 2011

sp:

CREATE PROC [dbo].[Usp_MenuMgrAddUpdMenupermission] 
@MenuID       INT,
@PermissionID INT,
@PortalID     INT,
@Username nvarchar(256)
AS
  BEGIN
      IF EXISTS(DELETE [dbo].[PagePermission]
                    WHERE [PortalID] = @PortalID AND
                          [MenuID] = @MenuID)

     INSERT INTO [dbo].[MenuPermission]
                    (MenuID,
                     PermissionID,
                     AddedOn,
                     Username)

        VALUES     (@MenuID,
                    @PermissionID,
                    Getdate(),
                    @UserName)
  END 

Но я получил синтаксическую ошибку.Пожалуйста, предложите правильный способ сделать это.

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

вы можете сделать это одним оператором, используя предложение OUTPUT :

DELETE [dbo].[PagePermission]
    OUTPUT @MenuID,@PermissionID,Getdate(),@UserName
        INTO [dbo].[MenuPermission]
    WHERE [PortalID] = @PortalID AND [MenuID] = @MenuID

рабочий пример:

DECLARE @PagePermission TABLE (PortalID int, MenuID int)
INSERT INTO @PagePermission VALUES (1,1)
INSERT INTO @PagePermission VALUES (2,1)
INSERT INTO @PagePermission VALUES (3,2)
INSERT INTO @PagePermission VALUES (4,2)

DECLARE @MenuPermission TABLE (MenuID int, PermissionID int,YourDate datetime, UserName varchar(10))

DECLARE @MenuID        int
       ,@PermissionID  int
       ,@UserName      varchar(10)
      ,@PortalID       int

SELECT @MenuID        =1
      ,@PermissionID  =100
      ,@UserName      ='xyz'
      ,@PortalID      =2

DELETE @PagePermission
    OUTPUT @MenuID,@PermissionID,Getdate(),@UserName
        INTO @MenuPermission
    WHERE PortalID = @PortalID AND MenuID = @MenuID

select * from @PagePermission

select * from @MenuPermission

ВЫВОД:

PortalID    MenuID
----------- -----------
1           1
3           2
4           2

(3 row(s) affected)

MenuID      PermissionID YourDate                UserName
----------- ------------ ----------------------- ----------
1           100          2011-11-09 09:18:52.693 xyz

(1 row(s) affected)
1 голос
/ 09 ноября 2011

Вот как бы я это сделал ( Отредактировано для новых требований ):

 IF EXISTS(SELECT TOP 1 1 FROM [dbo].[PagePermission]
           WHERE [PortalID] = @PortalID AND [MenuID] = @MenuID)
 BEGIN

   BEGIN TRANSACTION

   DELETE [dbo].[PagePermission]
   WHERE [PortalID] = @PortalID AND [MenuID] = @MenuID

   INSERT INTO [dbo].[MenuPermission]
           (MenuID, PermissionID, AddedOn, Username)
    VALUES (@MenuID, @PermissionID, Getdate(), @UserName)

   COMMIT TRANSACTION

END
ELSE
BEGIN
   INSERT INTO [dbo].[MenuPermission]
           (MenuID, PermissionID, AddedOn, Username)
    VALUES (@MenuID, @PermissionID, Getdate(), @UserName)
END
1 голос
/ 09 ноября 2011

Используйте переменную @@ROWCOUNT:

DELETE [dbo].[PagePermission] WHERE [PortalID] = @PortalID AND [MenuID] = @MenuID

IF @@ROWCOUNT > 0
    INSERT INTO [dbo].[MenuPermission] ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...