返回使用存储过程删除的行数

本文关键字:删除 存储过程 返回 | 更新日期: 2023-09-27 17:57:56

以下是删除过期会话的ASPState存储过程。如果您有自己的服务器,则可以将其配置为自动运行。然而,在共享主机上,你必须在定时间隔上从代码中调用它

 ALTER PROCEDURE [dbo].[DeleteExpiredSessions]
        AS
            SET NOCOUNT ON
            SET DEADLOCK_PRIORITY LOW 
            DECLARE @now datetime
            SET @now = GETUTCDATE() 
            CREATE TABLE #tblExpiredSessions 
            ( 
                SessionID nvarchar(88) NOT NULL PRIMARY KEY
            )
            INSERT #tblExpiredSessions (SessionID)
                SELECT SessionID
                FROM [luckysessions].dbo.ASPStateTempSessions WITH (READUNCOMMITTED)
                WHERE Expires < @now
            IF @@ROWCOUNT <> 0 
            BEGIN 
                DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY
                FOR SELECT SessionID FROM #tblExpiredSessions 
                DECLARE @SessionID nvarchar(88)
                OPEN ExpiredSessionCursor
                FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
                WHILE @@FETCH_STATUS = 0 
                    BEGIN
                        DELETE FROM [luckysessions].dbo.ASPStateTempSessions WHERE SessionID = @SessionID AND Expires < @now
                        FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
                    END
                CLOSE ExpiredSessionCursor
                DEALLOCATE ExpiredSessionCursor
            END 
            DROP TABLE #tblExpiredSessions
        RETURN 0  

我通过我的代码如下所示:

SqlConnection con = new SqlConnection("Data Source=xxxxx;Initial Catalog=xxxxx;User ID=xxxxx;Password=xxxx;");
            SqlCommand comm = new SqlCommand("DeleteExpiredSessions", con);
            comm.CommandType = CommandType.StoredProcedure;
            con.Open();
            int deleted = comm.ExecuteNonQuery();
            con.Close();

问题是,我想知道StoredProcedure删除了多少行,而ExecuteNonQuery将始终返回-1

我不想编辑storedProcedure,但是,如果这是最终的解决方案,那就顺其自然吧。

返回使用存储过程删除的行数

ALTER PROCEDURE[dbo]。[DeleteExpiredSessions](@deleted int output)作为设置NOCOUNT将死锁优先级设置为低

        DECLARE @now datetime
        SET @now = GETUTCDATE() SET @delted = 0

DELETE FROM[luckysessions].dbo.ASPStateTempSessions WHERE WHERE Expires<现在设置@deleted=@deleted+@@ROWCOUNT。。。

我认为你不需要把光标放在那里。无论哪种方式,最简单的解决方案都是只声明一个变量,每次删除库中任意数量的行或向其添加@ROWCOUNT。删除完成后,您可以选择它、返回它,也可以将它用作存储过程的输出参数。