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

时间:2014-04-11 10:10:33

标签: c# sql stored-procedures sql-server-2012

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

 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,但如果这是最终解决方案,那么就是它。

1 个答案:

答案 0 :(得分:2)

  

ALTER PROCEDURE [dbo]。[DeleteExpiredSessions](@ deleted int output)           如               设置NOCOUNT ON               SET DEADLOCK_PRIORITY LOW

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

...               DELETE FROM [luckysessions] .dbo.ASPStateTempSessions WHERE WHERE Expires&lt; @现在               SET @deleted = @deleted + @@ ROWCOUNT ...

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