我想用同一张表生成的值更新我的表。
我的目标是使用 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
我知道例行程序超级慢,但我该怎么办?