【发布时间】:2017-10-18 09:31:32
【问题描述】:
好的,这是我第二次尝试解决这个问题。
我想知道是否有一种可能的方法来优化为存储过程创建的游标,用于迭代具有两个联合的大选择语句。稍后,存储过程开始将值插入到临时表中,并根据“不存在”的选择语句检查每个值。
或者更好的是,是否可以使用 select 语句创建所有这些并可能加入。
插入过程需要很长时间才能完成,我会重新考虑选择数据会快得多。
这是一个 SQL 示例:
declare @ID1 varchar(40) ,
@ID2 varchar(20) ,
@State varchar(20) ,
@isActive bit
Declare CuTable SCROLL INSENSITIVE cursor for
Select
Cast(ID1 as Varchar(20)) AS ID1,
Cast(ID2 as Varchar(20)) AS ID2,
'AT' AS [State],
CASE When (isAvtiveDate > { fn CURDATE() }) or isAvtiveDate is null Then 1 else 0 end AS isAvtive
From
server1.db.dbo.table1
Inner Join
server1.db.dbo.table2 on ID2 = ID1
Where ID3 = 1 AND isActiveDate <= ISNULL(isActiveDate,'2020-01-01')
UNION
Select
Cast(ID1 as Varchar(20)) AS ID1,
Cast(ID2 as Varchar(20)) AS ID2,
'AP' AS [State],
CASE When (isActiveDate > { fn CURDATE() }) or isActiveDate is null Then 1 else 0 end AS isActive
From
server1.db.dbo.table1
Inner Join
server1.db.dbo.table2 on ID2 = ID1
Where
ID3 = 2 AND isActiveDate <= ISNULL(isActiveDate,'2020-01-01')
UNION
Select
Cast(ID1 as Varchar(20)) AS ID1,
Cast(ID2 as Varchar(20)) AS ID2,
'AH' AS [State],
CASE When (isActiveDate > { fn CURDATE() }) or isActiveDate is null Then 1 else 0 end AS isActive
From server1.db.dbo.table1 inner join server1.db.dbo.table2 on ID2 = ID1
inner join server1.db.dbo.table13 on ID2 = ID4
Where ID3 = 5 and toDate is null and fromDate is not null AND isActiveDate <= ISNULL(isActiveDate,'2020-01-01')
Open CuTable
Fetch Next From CuTable Into @ID1, @ID2, @[State], @isActive
While @@Fetch_Status = 0
Begin
Insert Into StagingTable (ID1, ID2, [State], isActive)
--Values
Select @ID1, @ID2, @[State], @isActive
where not exists(select * from StagingTable where ID1 = @ID1 and ID2 = @ID2)
Fetch Next From CuTable Into @ID1, @ID2, @[State], @isActive
End
close CuTable
deallocate CuTable
注意:我使用的是 SQL SERVER 2005
关于 Leonidas199x 评论线程的更新:
【问题讨论】:
标签: sql-server stored-procedures sql-server-2005 cursor upsert