我在 SQL Server 2008 r2 下的存储过程中有两个游标。它们在执行存储过程时浪费了我的时间?我有 2 张桌子
##TEMP
CatalogID Value
34567 80
34848 100
34725 40
##Temp1
Name Percentage
A 25
B 25
C 25
D 25
通过使用两个临时表,我将数据插入到目录表中并删除输入的目录 ID 和值。
catalogtable
CatalogID name value
34567 A 20
34567 B 20
34567 C 20
34567 D 20
34848 A 25
34848 B 25
34848 C 25
34848 D 25
34725 A 10
34725 B 10
34725 C 10
34725 D 10
我的光标是
DECLARE Cur_Rotation CURSOR
FOR
SELECT CatalogId,Value FROM ##TEMP
DECLARE @CatalogId INT
DECLARE @Value [decimal](5, 2)
OPEN Cur_Rotation
FETCH NEXT FROM Cur_Rotation INTO @CatalogId,@Value
While @@FETCH_STATUS = 0
BEGIN
DECLARE Cur_Inner CURSOR
FOR
SELECT Name,Percentage FROM ##Temp1
DECLARE @Name VARCHAR(50)
DECLARE @Percentage [decimal](5, 2)
OPEN Cur_Inner
FETCH NEXT FROM Cur_Inner INTO @Name,@Percentage
While @@FETCH_STATUS = 0
BEGIN
DECLARE @Value1 [decimal](5, 2)
SET @Value=@Value1*(@Percentage/100.00)
DELETE FROM CatalogDetails WHERE CatalogId=@CatalogId and name=@name
INSERT INTO CatalogDetails (name,RDDRotPcent,CatalogId)
VALUES (@name,@Value1,@CatalogId)
FETCH NEXT FROM Cur_Inner INTO @Name,@Percentage
END
CLOSE Cur_Inner
DEALLOCATE Cur_Inner
FETCH NEXT FROM Cur_Rotation INTO @CatalogId,@Value
END
CLOSE Cur_Rotation
DEALLOCATE Cur_Rotation
END
有没有机会使用任何逻辑来跳过游标。当时我的查询执行需要时间,CatalogID 将是数千。所以有没有机会改变我的 SCRIPT 以避免游标。