0

我有一个存储过程来插入记录。循环的SQL性能差异vs调用函数

我必须计算具有特定逻辑的列的日期值。目前,我已经为插入的数据创建了一个循环,并进行计算来填充日期。

问题是我需要避免使用循环插入数据并需要将它们作为批处理插入。为了做到这一点,我必须将日期计算逻辑移到一个函数中。

循环数据(当前有)和使用函数在性能方面有什么不同。

这里是我的存储过程:

WHILE @C <= @WeeklyDataCount 
BEGIN 
    DECLARE @PopulateDate DATE; 

    SELECT 
     @Value = D.Value, 
     @FromDate = D.FromDate 
    FROM 
     #WeeklyData D 
    WHERE 
     D.AutoId = @C; 

    -- Sample Date calculation logic that needs to move to a function 
    @DayCount = SELECT COUNT(*) 
       FROM DayTable 

    @Counter2 = 1; 

    WHILE @Counter2 < @DayCount 
    BEGIN 
     SET @PopulateDate = DATEADD(DAY, (-1 * @Counter2), @FromDate); 
     SET @Counter2 = @Counter2 + 1; 
    END 
    -- End of Day Calculation Logic 

    INSERT INTO TABLE1 (Value, PopulateDay) 
    VALUES(@Value, @PopulateDate) 

    SET @C= @C +1; 
END 
+3

一般来说,应该避免循环使用SQL。如果没有样本数据(最好是DDL + DML)和期望的结果,很难给出确切的答案。 –

+2

'(某些逻辑)'你能告诉我们它是什么吗?也许有可能用一些“朗朗上口”的陈述取代你的整个循环。 – Rokuto

+0

@Rokuto - 我已经更新了答案 – tarzanbappa

回答

0

你的整个循环可以用一个声明(我假设表DayTable等于从#WeeklyData每一行)来代替。

INSERT INTO TABLE1 (Value,PopulateDay) 
SELECT 
    D.Value, 
    DATEADD(DAY,(-1 * ((DayCount * (DayCount - 1))/2)),D.FromDate) 
FROM #WeeklyData D 
CROSS JOIN (SELECT COUNT(*) AS DayCount FROM DayTable) C 
    WHERE D.AutoId <= @WeeklyDataCount 
+2

只是挑剔 - “内部连接...在1 = 1上”实际上是“交叉连接”...... –