【问题标题】:return number of rows deleted using stored procedure返回使用存储过程删除的行数
【发布时间】:2014-05-25 10:27:44
【问题描述】:

以下是删除过期会话的 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

我不想编辑存储过程,但如果这是最终解决方案,那就这样吧。

【问题讨论】:

  • 存储过程不返回删除的行数并且您“不想编辑存储过程”。所以你不能
  • 但是,如果这是最终的解决方案,那就这样吧.. 但是如何?
  • 如果无法编辑存储过程,我认为解决方案可能是计算执行命令前后的会话数
  • 你需要SET NOCOUNT OFF然后

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


【解决方案1】:

ALTER PROCEDURE [dbo].[DeleteExpiredSessions](@deleted int output) 作为 设置无计数 设置 DEADLOCK_PRIORITY LOW

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

... 删除 [luckysessions].dbo.ASPStateTempSessions WHERE WHERE Expires

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

【讨论】:

  • 优秀的答案。我从中学到了如何传递输出参数 ;).. 但@Liam 仍然通过仅将 'SET NOCOUNT' 更改为 'OFF' 来解决它!
  • 我不是 C# 人,所以我不知道 C# 代码在这种情况下如何反应,但是从 DBA 方面设置 nocount off 会错误地回答您的问题。 Sql server 将为受您插入临时表影响的所有行重新输出 1 个输出,假设 5 行受到影响“(5 行受影响)”然后如果您的游标运行 5 次 sql server 将说 5 次“(1 行( s) 受影响)"。如果 C# 只读取 las messasge,您的计数将被取消。
  • 你的评论很奇怪,bec。我对其进行了测试,删除了 4 行,从 storedProcedure 中返回的数字是 4。同样,当没有删除行时,它给我 0,而它总是给我 -1。另请注意,这与 C# 无关。 C# 会增加程序返回的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 2023-03-10
  • 2018-10-19
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多