我想用同一张表生成的值更新我的表。
我的目标是使用 proftxt 搜索所有行,如 _NS 和 _WP 并使用相同的 ao,将它们相加,
将值除以该 ao 的 _H、_G、_L 元素的数量,然后将此值添加到 _H、_G 和_L对象的那个ao。
ao 可能只有 _NS 和 _WP 行。比例程要跳过这个ao。
例子:
我的数据看起来像:
an, ao, proftxt, value, year  
101 , 1, 'e_NSe', 5, 2006  
102 , 1, 'e_Ha', 1, 2006  
103 , 1, 'w_NSr', 4, 2006  
104 , 2, 'w_NSr', 2, 2006  
105 , 2, 'x_H05r', 4, 2006   
106 , 2, 'w_Gr', 2, 2006   
107 , 2, 'a_WPr', 4, 2006 
108 , 3, 'a_WPr', 4, 2006 
我的数据应该是这样的:
an, ao, proftxt, value, year  
102 , 1, 'e_Ha', 10 2006  
103 , 2, 'x_H05r', 7, 2006  
103 , 2, 'w_Gr', 5, 2006  
108 , 3, 'a_WPr', 4, 2006  
我的例程适用于少量测试数据。
更新功能结束,同时在真实数据库上工作,成功 13 小时后。
但它只编辑了 210000 行中的 5000 行。   
DECLARE @ENDYEAR INT
DECLARE @AO BIGINT
DECLARE @YEAR INT
DECLARE @ELEMENTS INT
--Parameter festlegen
SET @YEAR = 2006
SET @ENDYEAR = 2013 --Endyear+1  
SET @AO = 2  
WHILE(@YEAR<@ENDYEAR)
BEGIN     
WHILE (@AO >1)  --Do as long as Cursor is inside table
BEGIN  
    SET @AO = (SELECT TOP 1 ao FROM tbl_slp -- Search ao with _WP _NS
                 WHERE (proftxt LIKE '%[_]WP%' 
                         OR proftxt LIKE '%[_]NS%') 
                         AND year = @YEAR 
                         AND ao > @AO );
    SET @ELEMENTS = (SELECT COUNT(proftxt) --Count Number of _H, _G, _L elements
                            FROM tbl_SLP  
                            WHERE ao = @AO AND year = @YEAR AND  
                                (proftxt LIKE '%[_]H%' OR proftxt = NULL
                                  OR proftxt LIKE '%[_]G%'
                                  OR proftxt LIKE '%[_]L%'))
    IF (@ELEMENTS != 0)
    BEGIN
        UPDATE tbl_SLP --Update _H, _G, _L rows
        SET value = value + (SELECT SUM(CONVERT(float, value)) 
                            FROM tbl_SLP
                            WHERE (proftxt LIKE '%[_]WP%'
                                                            OR proftxt LIKE '%[_]NS%')
                                                            AND year = @YEAR 
                                                            AND ao = @AO)
                            /@ELEMENTS
        WHERE ao = @AO AND year = @YEAR 
        DELETE FROM tbl_SLP --delete_WP _NS rows
            WHERE ao= @AO 
                  AND year = @YEAR 
                  AND (proftxt LIKE '%[_]WP%' OR proftxt LIKE '%[_]NS%')
    END
    SET @AO = @AO +1
    END
    SET @YEAR = @YEAR +1
END
我知道例行程序超级慢,但我该怎么办?