在同一个存储过程中,程序执行了删除某个表的某条记录的SQL指令,然后查询后发现记录数没减少,存储过程执行完后再查,发现减少了。
我怀疑是事务导致的。
如何能够避开这个问题?存储过程如下:
ALTER PROCEDURE [dbo].[pro_BlackList_Delete]
@BlackList int
ASSET NOCOUNT ONDelete From BlackList Where BlackList = @BlackListIf Not Exists(Select * From BlackList) --删除到没数据了,还是不执行里头设置版本号为0的指令
Begin
Update BlackListVer Set Ver = 0
End

解决方案 »

  1.   

    If Not Exists(Select * From BlackList Where BlackList = @BlackList ) 
      

  2.   

    If Not Exists(Select * From BlackList)
    如果你不能保证表里面的数据只有BlackList = @BlackList 这些数据的话,那么你上面的if not exists就一定不会执行。你的逻辑有问题,不是事务的问题,可以用晴天大大的语句
      

  3.   

    [code=sql]
    ALTER PROCEDURE [dbo].[pro_BlackList_Delete]
        @BlackList int
    AS
     
    SET NOCOUNT ON
     
    Delete From BlackList Where BlackList = @BlackList
     
    If Not Exists(Select * From BlackList)    --你这个是判断表 BlackList里面是否有数据,你删除了BlackList = @BlackList的数据  但是不等的还存在    所以这个if 后面的语句不会被执行  
     --删除到没数据了,还是不执行里头设置版本号为0的指令
    Begin
        Update BlackListVer Set Ver = 0
    End
    [/code]
      

  4.   


    If Not Exists(Select * From BlackList Where BlackList = @BlackList ) 
    --@BlackList 应该是对这个的判断的吧.而不判断表里面有没有数据
      

  5.   

      
    Delete From BlackList Where BlackList = @BlackList   
    删除行数>0
    {
    If Not Exists(Select * From BlackList Where BlackList = @BlackList)
    --删除到没数据了,还是不执行里头设置版本号为0的指令 
    }
      

  6.   


    ALTER PROCEDURE [dbo].[pro_BlackList_Delete]
        @BlackList int
    AS
     
    SET NOCOUNT ON
     
    Delete From BlackList Where BlackList = @BlackList    --测试的时候,是删完了最后一条记录了,也就是执行这条语句后,这个表就不再有数据了。因此执行下面的语句,判断没有记录的话,设置版本号为0,若是有记录的话,版本号就不能设置为0了。
     
    If Not Exists(Select * From BlackList)        --删除到没数据了,还是不执行里头设置版本号为0的指令
    Begin
        Update BlackListVer Set Ver = 0
    End
    这个问题的核心是在同一个存储过程中,虽然删掉了数据,可是还是能查出来,除非事物已经提交,有点类似Oracle一样,没有提交就没有影响,只是SQL语句已经成功执行了。
      

  7.   

    试试:ALTER  PROCEDURE [dbo].[pro_BlackList_Delete] @BlackList INT
    AS 
        SET NOCOUNT ON
       
        DELETE  FROM BlackList
        WHERE   BlackList = @BlackList    --测试的时候,是删完了最后一条记录了,也就是执行这条语句后,这个表就不再有数据了。因此执行下面的语句,判断没有记录的话,设置版本号为0,若是有记录的话,版本号就不能设置为0了。 
        IF @@ROWCOUNT <> 0 
            COMMIT     IF NOT EXISTS ( SELECT  *
                        FROM    BlackList )        --删除到没数据了,还是不执行里头设置版本号为0的指令 
            BEGIN
                UPDATE  BlackListVer
                SET     Ver = 0 
            END