以下是删除过期会话的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,但如果这是最终解决方案,那么就是它。
答案 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它,或者您可以将它用作存储过程的输出参数。