sql - 游标和存储过程优化

标签 sql sql-server stored-procedures cursor query-optimization

下面的存储过程是前段时间写的,现在需要修改。

联系不上原开发者,就去看看。对我来说,这个过程似乎过于复杂。难道不能通过简单的 UPDATE 来完成吗?任何人都可以证明在这里使用 CURSOR 是合理的吗?

ALTER PROCEDURE [settle_Stage1]
    @settleBatch int
AS

DECLARE @refDate datetime;
DECLARE @dd int;
DECLARE @uid int;

DECLARE trans_cursor CURSOR FOR 
SELECT uid, refDate FROM tblTransactions WHERE (settle IS NULL ) AND (state IN (  21, 31, 98, 99 ))
OPEN trans_cursor
FETCH FROM trans_cursor INTO @uid, @refDate
WHILE @@FETCH_STATUS = 0
   BEGIN
    SET @dd = DATEDIFF( day, @refDate, getDate())
    IF ( @dd >= '1' )
      BEGIN
        UPDATE tblTransactions
        SET settle = @settleBatch WHERE uid = @uid
      END
    FETCH FROM trans_cursor INTO @uid, @refDate
   END  
CLOSE trans_cursor
DEALLOCATE trans_cursor

最佳答案

你是对的 - 这看起来像“过程 SQL”,来自可能不了解 SQL 和设置操作的人。

并将其转换为基于集合的查询应该有助于提高性能。

不需要游标,并且确实使存储过程过于复杂。

关于sql - 游标和存储过程优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8312673/

相关文章:

sql - MERGE表,匹配时不执行任何操作

MySQL -> 带有大表问题的 SQL Server 迁移助手

sql - 二叉树获取最左或最右的底部

带有 GROUP_CONCAT 和 IN 子句的 mysql 存储过程构造

mysql - 使用 MySQL Workbench 的存储过程

java - 新手指针 rs.next

sql - 我可以在同一个查询结果(oracle)中返回多个计数器吗?

javascript - 在 d3.js 图表中回显 JSON

sql-server - 将 Access 表单绑定(bind)到存储过程的结果

php - MySQL - 过滤结果