我的代码如下。由于我是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
非常感谢您的帮助。
答案 0 :(得分:3)
您的查询运行缓慢,这就是原因。
光标的表现非常出色,这是RBAR方法论
这是您的光标当前正在做什么,以及为什么要花很长时间(除了阻止更新,索引和yada yada所需的锁之外)。
select count(Symbology_BBL) from tableName
这里返回的数字是什么...您的光标是
因此,基本上,如果该表中有1000行,则对每一行进行1000次更新。而且,这意味着零,或者至少与您组织更新的最不高性能方式有关。您最可能想要的是UPDATE with a JOIN,但您提供的信息不足以决定这一点。
此外,您使用FAST_FORWARD
代替READ_ONLY FORWARD_ONLY
来could get a slight进行增强,因为至少在默认情况下游标是全局的(并且在您的不必要用例)。但是Erik Darling显示了如何防止它并行运行...偷偷摸摸的Microsoft ...从而LOCAL STATIC
与FORWARD_ONLY
可以更快...再次添加LOCAL STATIC
对于大多数光标。
编辑
根据您的评论并在此处进行编辑是最简单的方法...
LOCAL STATIC
答案 1 :(得分:0)
此update
没有where
子句,因此它将写入所有行。
Update [tablename]
set symbology_bbl = @Symbology_BBL