最佳SQL方法,用于根据另一列的日期范围更新一列。

时间:2018-11-28 20:55:44

标签: sql sql-server

我的代码如下。由于我是SQL新手,因此我很难解决要基于日期差更新列的方法更简单的方法。基本上我想做的是如果日期介于今天到今天之间减去7天(将symbology_bbl列更新为week1)。以下内容已更新。

USE [databasename]
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE or Alter PROCEDURE gisuser.GetTheDate
AS
BEGIN 
SET NOCOUNT ON;  
    Declare @rowcount int
    Declare @editedDate datetime
    Declare @Symbology_BBL nvarchar(25)

    Declare mycursor cursor FORWARD_ONLY READ_ONLY LOCAL FOR 
        select objectID, Edited_Date, Symbology_BBL 
        from [tablename] order by objectid asc
    Open mycursor
    fetch next from mycursor
        into @rowcount, @editedDate, @Symbology_BBL

    while @@FETCH_STATUS = 0
    Begin
    --if edited_date is from 11/21/2018 to 11/28/2018
    begin
    set @Symbology_BBL = 'Week1'
    end
    --elseif edited_date is from 11/15/2018 to 11/20/2018
    begin
    set @Symbology_BBL = 'Week2'
    end
    else 
    begin
    set @Symbology_BBL = 'Greater than Week3'
    end
--*******************************************************************************
        Update [tablename]
        set symbology_bbl = @Symbology_BBL

        fetch next from mycursor
        into @rowcount, @editedDate, @Symbology_BBL
      End
    Close mycursor
    deallocate mycursor
END

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您的查询运行缓慢,这就是原因。

光标的表现非常出色,这是RBAR方法论

这是您的光标当前正在做什么,以及为什么要花很长时间(除了阻止更新,索引和yada yada所需的锁之外)。

select count(Symbology_BBL) from tableName

这里返回的数字是什么...您的光标是

  • 执行/循环多次,
  • 为每行...每一次设置Symbology_BBL ='usa'

因此,基本上,如果该表中有1000行,则对每一行进行1000次更新。而且,这意味着零,或者至少与您组织更新的最不高性能方式有关。您最可能想要的是UPDATE with a JOIN,但您提供的信息不足以决定这一点。

此外,您使用FAST_FORWARD代替READ_ONLY FORWARD_ONLYcould get a slight进行增强,因为至少在默认情况下游标是全局的(并且在您的不必要用例)。但是Erik Darling显示了如何防止它并行运行...偷偷摸摸的Microsoft ...从而LOCAL STATICFORWARD_ONLY可以更快...再次添加LOCAL STATIC对于大多数光标。

编辑

根据您的评论并在此处进行编辑是最简单的方法...

LOCAL STATIC

答案 1 :(得分:0)

update没有where子句,因此它将写入所有行。

    Update [tablename]
    set symbology_bbl = @Symbology_BBL