如何解决SQL Server 2008:帮助优化使用游标的查询
| 我需要重写此内容,以免导致数据库溢出。我需要重写它,以便它不使用游标。 谢谢。解决方法
更新这里有一些测试数据:
CREATE TABLE #TableB(SKU INT,BeginYear INT,EndYear INT,OptionA VARCHAR(10),OptionB VARCHAR(10))
INSERT INTO #TableB(SKU,BeginYear,EndYear,OptionA,OptionB)
VALUES (1,1920,1950,\'option1\',\'option1\'),(1,1980,2001,\'option2\'),1940,1952,--overlapping years
(2,2005,\'option1\')
CREATE TABLE #TableA(SKU INT,OptionB VARCHAR(10),Years INT)
然后,您可以尝试递归CTE:
;WITH CTE AS
(
SELECT DISTINCT SKU,OptionB
FROM #TableB
UNION ALL
SELECT SKU,BeginYear+1,OptionB
FROM CTE
WHERE BeginYear < EndYear
)
INSERT INTO #TableA(SKU,OptionB,Years)
SELECT DISTINCT SKU,BeginYear
FROM CTE
OPTION(MAXRECURSION 0)
SELECT *
FROM #TableA
ORDER BY SKU,Years
这里没有笛卡尔积。
,您可以轻松地将while循环替换为游标,如果您炸断了tempdb,请执行一些中间事务
declare @counter int
declare @temptable as tatble (RecID int Identity(1,1),SKU Varchar(25),OptionA Varchar(50),OptionB Varchar(50),CurrentYear Int,EndYear Int)
insert into @temptable
Select SKU,EndYear
From TableB
set @counter = (select max(recid) from @temptable)
begin transaction
while @counter <> 0
Begin
(***whatever sql logic***)
if (@counter % 5000 = 0) and @@error = 0
commit Transaction
begin Transaction
set @counter = @counter -1
End
commit transaction
,可能会减少插入次数
Declare @temp table (
SKU Varchar(25),[Year] Int
)
While @@FETCH_STATUS = 0
Begin
While @CurrentYear <= @EndYear
Begin
Insert Into @temp(SKU,Years)
Values(@SKU,@OptionA,@OptionB,@CurrentYear)
Set @CurrentYear = @CurrentYear + 1
End
Insert Into TableA
Select * From @temp
Delete From @temp
Fetch Next From @Row Into @SKU,@CurrentYear,@EndYear,@OptionB
End
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。