一般在處理迴圈問題的時候,大家都會選擇Cursor,因為使用起來非常方便,代碼也很好實現,但是使用Cursor肯能會產生效能問題。那麼有什麼好的替代方法嗎?從網上看到的一篇文章很有借鑒意義(ReplacingCursors
and While Loops),改寫Cursor效能提高了幾倍.
所以我們在設計代碼的時候可以多考慮考慮是否不用Cursor也可以實現。 原始碼和改寫後的代碼如下:
--原始碼先查詢r查詢@tmp_id然後跟據@tmp_id獲得tmp_values然後更新表OutPut_tbl的值
DECLARE temp_cursor
CURSOR FOR
SELECT column_data
FROM DB.dbo.many_tbl
WHERE id
= @tmp_id -- key data
ORDER BY column_data
OPEN temp_cursor
FETCH NEXT
FROM temp_cursor
INTO @tmp_data
WHILE
@@FETCH_STATUS = 0
BEGIN
SELECT @tmp_values
= @tmp_values +
convert(varchar(20), @tmp_data)
+ ','
FETCH NEXT
FROM temp_cursor
INTO @tmp_data
END
CLOSE temp_cursor
DEALLOCATE temp_cursor
UPDATE DB.dbo.OutPut_tbl
SET column_out
= @tmp_values
WHERE id
= @tmp_id
--替換代碼(速度變快而且代碼簡潔)
CREATE function dbo.ufn_data_pivot(@id
as int)
Returns varchar(20)
AS
BEGIN
DECLARE @value
varchar(20)
SET @value
= ''
SELECT @value
= @value + convert(varchar(20), column_data)
+ ','
FROM DB.dbo.many_tbl
WHERE id = @id
ORDER BY column_data
Return @value
END
UPDATE DB.dbo.OutPut_tbl
SET column_out= dbo.ufn_data_pivot(key_column)