|
database
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
Using break with nested cursorsfailed in the first child cursor, break that child fetch, and should go to the parent cursor and continue looping to next row. My problem is when a condition falis in CHILD 1, then the PARENT FETCH also exiting. It is not going to the next row. Can anybody please help me? I am adding my stored proc too Ex: PARENT CURSOR START CHILD 1 CURSOR START IF (1=0) BREAK CHILD 1 CURSOR END CHILD 2 CURSOR START IF (1=0) BREAK CHILD 2 CURSOR END PARENT CURSOR END SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO --region [dbo].[PQTest] ------------------------------------------------------------------------------------------------------------------------ CREATE PROCEDURE [dbo].[PQTest] --Lead Options @PLoan varchar(50), @SLoan bit, @UnSLoan bit = 1, @PersonalGuarantee bit, -- RAs @CUR money = null, @QWIK money = null, @OPM money = null, @ROA money = null, @DPO money = null, @DI money = null, @SALES2NETFA money = null, @SALES2WC money = null, @ASSETTURN money = null, @FA_EQUITY money = null, @LIAB_EQUITY money = null, @COGS_AP money = null, @EBIT_INT money = null, @DEPS_SALES money = null, @DSO money = null, --LIs @CA money = null, @FA money = null, @ASSETS money = null, @CL money = null, @LTL money = null, @LIABS money = null, @EQUITY money = null, @SALES money = null, @COGS money = null, @EXP money = null, @ORDINCM money = null, @NEROTHER money = null, @NI money = null AS SET NOCOUNT ON SET TRANSACTION ISOLATION LEVEL READ COMMITTED DECLARE @PartnerID INT DECLARE @Check bit DECLARE @TableVar TABLE (PartnerID int) DECLARE @RAAbbrev varchar(15) DECLARE @RAOperator varchar (15) DECLARE @RAValue money DECLARE @CustRAValue money DECLARE @LIAbbrev varchar(15) DECLARE @LIOperator varchar (15) DECLARE @LIValue money DECLARE @CustLIValue money SET @Check = 1 -- true by default /****************************************RA Comporision*******************************************************/ DECLARE Partners_Cursor CURSOR FOR SELECT PartnerID FROM [dbo].[Partners] WHERE ( ( ('''' + REPLACE(PLoan, ',', ''',''') + '''') LIKE '%' + @PLoan+ '%') OR PLoan IS NULL OR LTRIM(RTRIM(PLoan)) = '' ) AND SLoanRequired = @SLoan AND PersonalGuaranteeRequired = @PersonalGuarantee for read only OPEN Partners_Cursor FETCH NEXT FROM Partners_Cursor INTO @PartnerID WHILE @@FETCH_STATUS = 0 BEGIN /*********************Child 1 Cursor***********************************/ DECLARE RA_Cursor CURSOR FOR SELECT RAAbbrev, Operator, Value FROM ToleranceRAValues RA INNER JOIN RADesc DES ON RA.RAID = DES.RADescID where partnerID = @PartnerID for read only OPEN RA_Cursor FETCH NEXT FROM RA_Cursor INTO @RAAbbrev, @RAOperator, @RAValue WHILE @@fetch_status = 0 BEGIN SELECT @CustRAValue = ( SELECT CASE WHEN @RAAbbrev = 'CUR' THEN cast(@CUR as money) WHEN @RAAbbrev = 'QWIK' THEN cast(@QWIK as money) WHEN @RAAbbrev = 'OPM' THEN cast(@OPM as money) WHEN @RAAbbrev = 'ROA' THEN cast(@ROA as money) WHEN @RAAbbrev = 'DPO' THEN cast(@DPO as money) WHEN @RAAbbrev = 'DI' THEN cast(@DI as money) WHEN @RAAbbrev = 'SALES2NETFA' THEN cast(@SALES2NETFA as money) WHEN @RAAbbrev = 'SALES2WC' THEN cast(@SALES2WC as money) WHEN @RAAbbrev = 'ASSETTURN' THEN cast(@ASSETTURN as money) WHEN @RAAbbrev = 'FA_EQUITY' THEN cast(@FA_EQUITY as money) WHEN @RAAbbrev = 'LIAB_EQUITY' THEN cast(@LIAB_EQUITY as money) WHEN @RAAbbrev = 'COGS_AP' THEN cast(@COGS_AP as money) WHEN @RAAbbrev = 'EBIT_INT' THEN cast(@EBIT_INT as money) WHEN @RAAbbrev = 'DEPS_SALES' THEN cast(@DEPS_SALES as money) WHEN @RAAbbrev = 'DSO' THEN cast(@DSO as money) END ) print 'PartnerID: ' + cast(@partnerid as varchar) print 'RAOperator: ' + cast(@RAOperator as varchar) print 'CustRAValue: ' + cast(@CustRAValue as varchar) print 'RAOperator: ' + cast(@RAOperator as varchar) print 'RAValue: ' + cast(@RAValue as varchar) IF (@RAOperator = '>') BEGIN --if (@CustRAValue >= @RAValue) if (@CustRAValue < @RAValue) BEGIN SET @Check = 0 print 'Check: ' + cast(@Check as varchar) BREAK; END END IF (@RAOperator = '<') BEGIN if (@CustRAValue > @RAValue) BEGIN SET @Check = 0 print 'Check: ' + cast(@Check as varchar) BREAK; END END FETCH NEXT FROM RA_Cursor INTO @RAAbbrev, @RAOperator, @RAValue END CLOSE RA_Cursor DEALLOCATE RA_Cursor /*********************Child 1 end******************************/ -- Compare against line items only of no RAs comparision failed or no RAs IF (@Check = 1) BEGIN /*********************Child 2 Cursor***********************************/ DECLARE LI_Cursor CURSOR FOR SELECT LIAbbrev, Operator, Value FROM ToleranceLIValues LI INNER JOIN LIDesc DES ON LI.LIID = DES.LIDescID where partnerID = @PartnerID for read only OPEN LI_Cursor FETCH NEXT FROM LI_Cursor INTO @LIAbbrev, @LIOperator, @LIValue WHILE @@fetch_status = 0 BEGIN SELECT @CustLIValue = ( SELECT CASE WHEN @LIAbbrev = 'CA' THEN cast(@CA as money) WHEN @LIAbbrev = 'FA' THEN cast(@FA as money) WHEN @LIAbbrev = 'ASSETS' THEN cast(@ASSETS as money) WHEN @LIAbbrev = 'CL' THEN cast(@CL as money) WHEN @LIAbbrev = 'LTL' THEN cast(@LTL as money) WHEN @LIAbbrev = 'LIABS' THEN cast(@LIABS as money) WHEN @LIAbbrev = 'EQUITY' THEN cast(@EQUITY as money) WHEN @LIAbbrev = 'SALES' THEN cast(@SALES as money) WHEN @LIAbbrev = 'COGS' THEN cast(@COGS as money) WHEN @LIAbbrev = 'EXP' THEN cast(@EXP as money) WHEN @LIAbbrev = 'ORDINCM' THEN cast(@ORDINCM as money) WHEN @LIAbbrev = 'NEROTHER' THEN cast(@NEROTHER as money) WHEN @LIAbbrev = 'NI' THEN cast(@NI as money) END ) print 'PartnerID: ' + cast(@partnerid as varchar) print 'LIOperator: ' + cast(@LIOperator as varchar) print 'CustLIValue: ' + cast(@CustLIValue as varchar) print 'LIOperator: ' + cast(@LIOperator as varchar) print 'LIValue: ' + cast(@LIValue as varchar) IF (@LIOperator = '>') BEGIN if (@CustLIValue < @LIValue) BEGIN SET @Check = 0 print 'Check: ' + cast(@Check as varchar) --BREAK; END END IF (@LIOperator = '<') BEGIN if (@CustLIValue > @LIValue) BEGIN SET @Check = 0 print 'Check: ' + cast(@Check as varchar) --BREAK; END END FETCH NEXT FROM LI_Cursor INTO @LIAbbrev, @LIOperator, @LIValue END CLOSE LI_Cursor DEALLOCATE LI_Cursor /*********************Child 2 Cursor end******************************/ END -- save partnerid in temp table when all the checks passed or if no tolerances exists IF (@Check = 1) INSERT INTO @TableVar (Partnerid) VALUES (@PartnerID) FETCH NEXT FROM Partners_Cursor INTO @PartnerID END CLOSE Partners_Cursor DEALLOCATE Partners_Cursor select * from @TableVar GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO I found where the problem was. This is the problem with @Check flag
that I am using. This needs to be reset. This is not a problem with BREAK. Thanks vgudda***@gmail.com wrote: Show quote > I wrote a stored proccedure with nested cursors. If one condition > failed in the first child cursor, break that child fetch, and should go > to the parent cursor and continue looping to next row. > > My problem is when a condition falis in CHILD 1, then the PARENT FETCH > also exiting. It is not going to the next row. Can anybody please help > me? I am adding my stored proc too > Ex: > > > PARENT CURSOR START > CHILD 1 CURSOR START > > IF (1=0) > BREAK > > CHILD 1 CURSOR END > > CHILD 2 CURSOR START > > IF (1=0) > BREAK > > CHILD 2 CURSOR END > PARENT CURSOR END > > > > SET QUOTED_IDENTIFIER ON > GO > SET ANSI_NULLS ON > GO > > --region [dbo].[PQTest] > > ------------------------------------------------------------------------------------------------------------------------ > CREATE PROCEDURE [dbo].[PQTest] > --Lead Options > @PLoan varchar(50), > @SLoan bit, > @UnSLoan bit = 1, > @PersonalGuarantee bit, > -- RAs > @CUR money = null, > @QWIK money = null, > @OPM money = null, > @ROA money = null, > @DPO money = null, > @DI money = null, > @SALES2NETFA money = null, > @SALES2WC money = null, > @ASSETTURN money = null, > @FA_EQUITY money = null, > @LIAB_EQUITY money = null, > @COGS_AP money = null, > @EBIT_INT money = null, > @DEPS_SALES money = null, > @DSO money = null, > --LIs > @CA money = null, > @FA money = null, > @ASSETS money = null, > @CL money = null, > @LTL money = null, > @LIABS money = null, > @EQUITY money = null, > @SALES money = null, > @COGS money = null, > @EXP money = null, > @ORDINCM money = null, > @NEROTHER money = null, > @NI money = null > > > AS > > SET NOCOUNT ON > SET TRANSACTION ISOLATION LEVEL READ COMMITTED > > DECLARE @PartnerID INT > DECLARE @Check bit > DECLARE @TableVar TABLE (PartnerID int) > > DECLARE @RAAbbrev varchar(15) > DECLARE @RAOperator varchar (15) > DECLARE @RAValue money > DECLARE @CustRAValue money > > DECLARE @LIAbbrev varchar(15) > DECLARE @LIOperator varchar (15) > DECLARE @LIValue money > DECLARE @CustLIValue money > > SET @Check = 1 -- true by default > > /****************************************RA > Comporision*******************************************************/ > > DECLARE Partners_Cursor CURSOR FOR > SELECT PartnerID > FROM > [dbo].[Partners] > WHERE ( > ( > ('''' + REPLACE(PLoan, ',', ''',''') + '''') LIKE '%' + @PLoan+ > '%') OR > PLoan IS NULL OR > LTRIM(RTRIM(PLoan)) = '' > ) AND > SLoanRequired = @SLoan AND > PersonalGuaranteeRequired = @PersonalGuarantee for read only > > OPEN Partners_Cursor > FETCH NEXT FROM Partners_Cursor INTO @PartnerID > > WHILE @@FETCH_STATUS = 0 > BEGIN > > /*********************Child 1 > Cursor***********************************/ > > DECLARE RA_Cursor CURSOR FOR > SELECT RAAbbrev, Operator, Value FROM ToleranceRAValues RA INNER > JOIN RADesc DES ON > RA.RAID = DES.RADescID where partnerID = @PartnerID for read only > > OPEN RA_Cursor > FETCH NEXT FROM RA_Cursor INTO @RAAbbrev, @RAOperator, @RAValue > > WHILE @@fetch_status = 0 > BEGIN > > SELECT @CustRAValue = ( SELECT > CASE > WHEN @RAAbbrev = 'CUR' THEN cast(@CUR as money) > WHEN @RAAbbrev = 'QWIK' THEN cast(@QWIK as money) > WHEN @RAAbbrev = 'OPM' THEN cast(@OPM as money) > WHEN @RAAbbrev = 'ROA' THEN cast(@ROA as money) > WHEN @RAAbbrev = 'DPO' THEN cast(@DPO as money) > WHEN @RAAbbrev = 'DI' THEN cast(@DI as money) > WHEN @RAAbbrev = 'SALES2NETFA' THEN cast(@SALES2NETFA as money) > WHEN @RAAbbrev = 'SALES2WC' THEN cast(@SALES2WC as money) > WHEN @RAAbbrev = 'ASSETTURN' THEN cast(@ASSETTURN as money) > WHEN @RAAbbrev = 'FA_EQUITY' THEN cast(@FA_EQUITY as money) > WHEN @RAAbbrev = 'LIAB_EQUITY' THEN cast(@LIAB_EQUITY as money) > WHEN @RAAbbrev = 'COGS_AP' THEN cast(@COGS_AP as money) > WHEN @RAAbbrev = 'EBIT_INT' THEN cast(@EBIT_INT as money) > WHEN @RAAbbrev = 'DEPS_SALES' THEN cast(@DEPS_SALES as money) > WHEN @RAAbbrev = 'DSO' THEN cast(@DSO as money) > END > ) > > print 'PartnerID: ' + cast(@partnerid as varchar) > print 'RAOperator: ' + cast(@RAOperator as varchar) > print 'CustRAValue: ' + cast(@CustRAValue as varchar) > print 'RAOperator: ' + cast(@RAOperator as varchar) > print 'RAValue: ' + cast(@RAValue as varchar) > > > > IF (@RAOperator = '>') > BEGIN > --if (@CustRAValue >= @RAValue) > if (@CustRAValue < @RAValue) > BEGIN > SET @Check = 0 > print 'Check: ' + cast(@Check as varchar) > BREAK; > END > END > IF (@RAOperator = '<') > BEGIN > if (@CustRAValue > @RAValue) > BEGIN > SET @Check = 0 > print 'Check: ' + cast(@Check as varchar) > BREAK; > END > END > > > FETCH NEXT FROM RA_Cursor INTO @RAAbbrev, @RAOperator, @RAValue > END > > CLOSE RA_Cursor > DEALLOCATE RA_Cursor > /*********************Child 1 end******************************/ > > -- Compare against line items only of no RAs comparision failed or no > RAs > IF (@Check = 1) > BEGIN > > /*********************Child 2 > Cursor***********************************/ > DECLARE LI_Cursor CURSOR FOR > SELECT LIAbbrev, Operator, Value FROM ToleranceLIValues LI INNER > JOIN LIDesc DES ON > LI.LIID = DES.LIDescID where partnerID = @PartnerID for read only > > OPEN LI_Cursor > FETCH NEXT FROM LI_Cursor INTO @LIAbbrev, @LIOperator, @LIValue > > WHILE @@fetch_status = 0 > BEGIN > > SELECT @CustLIValue = ( SELECT > CASE > WHEN @LIAbbrev = 'CA' THEN cast(@CA as money) > WHEN @LIAbbrev = 'FA' THEN cast(@FA as money) > WHEN @LIAbbrev = 'ASSETS' THEN cast(@ASSETS as money) > WHEN @LIAbbrev = 'CL' THEN cast(@CL as money) > WHEN @LIAbbrev = 'LTL' THEN cast(@LTL as money) > WHEN @LIAbbrev = 'LIABS' THEN cast(@LIABS as money) > WHEN @LIAbbrev = 'EQUITY' THEN cast(@EQUITY as money) > WHEN @LIAbbrev = 'SALES' THEN cast(@SALES as money) > WHEN @LIAbbrev = 'COGS' THEN cast(@COGS as money) > WHEN @LIAbbrev = 'EXP' THEN cast(@EXP as money) > WHEN @LIAbbrev = 'ORDINCM' THEN cast(@ORDINCM as money) > WHEN @LIAbbrev = 'NEROTHER' THEN cast(@NEROTHER as money) > WHEN @LIAbbrev = 'NI' THEN cast(@NI as money) > END > ) > > print 'PartnerID: ' + cast(@partnerid as varchar) > print 'LIOperator: ' + cast(@LIOperator as varchar) > print 'CustLIValue: ' + cast(@CustLIValue as varchar) > print 'LIOperator: ' + cast(@LIOperator as varchar) > print 'LIValue: ' + cast(@LIValue as varchar) > > IF (@LIOperator = '>') > BEGIN > if (@CustLIValue < @LIValue) > BEGIN > SET @Check = 0 > print 'Check: ' + cast(@Check as varchar) > --BREAK; > END > END > IF (@LIOperator = '<') > BEGIN > if (@CustLIValue > @LIValue) > BEGIN > SET @Check = 0 > print 'Check: ' + cast(@Check as varchar) > --BREAK; > END > END > > > FETCH NEXT FROM LI_Cursor INTO @LIAbbrev, @LIOperator, @LIValue > END > > CLOSE LI_Cursor > DEALLOCATE LI_Cursor > /*********************Child 2 Cursor > end******************************/ > > END > > -- save partnerid in temp table when all the checks passed or if no > tolerances exists > IF (@Check = 1) > INSERT INTO @TableVar (Partnerid) VALUES (@PartnerID) > > > FETCH NEXT FROM Partners_Cursor INTO @PartnerID > END > > CLOSE Partners_Cursor > DEALLOCATE Partners_Cursor > > select * from @TableVar > > GO > SET QUOTED_IDENTIFIER OFF > GO > SET ANSI_NULLS ON > GO |
|||||||||||||||||||||||