Quantcast
Channel: Transact-SQL forum
Viewing all articles
Browse latest Browse all 12890

looking for CURSOR replacement, please suggest!

$
0
0

Hello Experts,

I having some master tables "#ACTION_MASTER" & "#RPT_MILE_MASTER" and a link table "#ACTION_MILE_RPT_LINK" showing their relationship.

And again I having a derive table "#TBL" to finally update the master table ''#ACTION_MASTER".

I am able to do the task with below approach and I would like to know how to optimize it, please suggest and let me know for any other information. Thanks! 

CREATE TABLE #ACTION_MASTER (UID INT, ACTION_ID INT, IS_ACTV BIT)
INSERT INTO #ACTION_MASTER VALUES (1, 102, 1), (2, 103, 1)
--SELECT * FROM #ACTION_MASTER

CREATE TABLE #RPT_MILE_MASTER (UID INT, RPT_ID INT, MILE_ID INT, MILE_STATUS INT)
INSERT INTO #RPT_MILE_MASTER VALUES (1, 12, 1, 5), (2, 13, 2, 2)
--SELECT * FROM #RPT_MILE_MASTER

CREATE TABLE #ACTION_MILE_RPT_LINK (LINK_ID INT, ACTION_ID INT, RPT_ID INT, MILE_ID INT)
INSERT INTO #ACTION_MILE_RPT_LINK VALUES (1, 102, 12, 1), (2, 102, 13, 2), (3, 103, 13, 2)
--SELECT * FROM #ACTION_MILE_RPT_LINK

CREATE TABLE #TBL (RPT_ID INT, MILE_ID INT, MILE_STATUS INT)
INSERT INTO #TBL VALUES (13, 1, 5), (13, 2, 5)
--SELECT * FROM #TBL


DECLARE @ACTION_ID INT
DECLARE DB_CURSOR CURSOR FOR  

SELECT DISTINCT ACTION_ID FROM #ACTION_MILE_RPT_LINK WHERE MILE_ID IN (SELECT MILE_ID FROM #TBL WHERE MILE_STATUS = 5)  

OPEN DB_CURSOR   
FETCH NEXT FROM DB_CURSOR INTO @ACTION_ID
WHILE @@FETCH_STATUS = 0   
BEGIN   
	   IF EXISTS(
	   SELECT * FROM #ACTION_MILE_RPT_LINK
	   WHERE MILE_ID IN (SELECT MILE_ID FROM #TBL WHERE MILE_STATUS = 5) 
	   AND RPT_ID NOT IN (SELECT DISTINCT RPT_ID FROM #TBL)
	   AND ACTION_ID = @ACTION_ID)
	   BEGIN
	    DECLARE @COMPARE TABLE (RPT_ID INT, MILE_ID INT, MILE_STATUS INT)
		INSERT INTO @COMPARE
			SELECT RPT_ID, MILE_ID, 5 'MILE_STATUS' FROM #ACTION_MILE_RPT_LINK
			WHERE MILE_ID IN (SELECT MILE_ID FROM #TBL WHERE MILE_STATUS = 5) 
			AND RPT_ID NOT IN (SELECT DISTINCT RPT_ID FROM #TBL)
			AND ACTION_ID = @ACTION_ID
		IF NOT EXISTS(
        SELECT RPT_ID, MILE_ID, MILE_STATUS FROM #RPT_MILE_MASTER WHERE RPT_ID IN (SELECT RPT_ID FROM @COMPARE)
		EXCEPT
		SELECT RPT_ID, MILE_ID, MILE_STATUS FROM @COMPARE)
		BEGIN
			UPDATE #ACTION_MASTER SET IS_ACTV = 0 WHERE ACTION_ID = @ACTION_ID
		END
	   END
	   ELSE
	   BEGIN
		UPDATE #ACTION_MASTER SET IS_ACTV = 0 WHERE ACTION_ID = @ACTION_ID
	   END

       FETCH NEXT FROM DB_CURSOR INTO @ACTION_ID
END   
CLOSE DB_CURSOR   
DEALLOCATE DB_CURSOR
--SELECT * FROM #ACTION_MASTER
DROP TABLE #ACTION_MASTER
DROP TABLE #RPT_MILE_MASTER
DROP TABLE #ACTION_MILE_RPT_LINK
DROP TABLE #TBL


Viewing all articles
Browse latest Browse all 12890

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>