Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
saiabhiram
Starting Member
17 Posts |
Posted - 2010-04-18 : 01:07:28
|
| [code]USE [EDMSTAGE]GO/****** Object: StoredProcedure [TTXDOM01\devayb].[sp_MakeSelheadUpdates] Script Date: 04/17/2010 19:57:10 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:SAB-- Create date: 4/15/2010-- Description: Reads the Exception Extract and makes updates to SELHEAD (IMS database)-- =============================================ALTER PROCEDURE [TTXDOM01\devayb].[sp_MakeSelheadUpdates] -- Add the parameters for the stored procedure here --<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> ASBEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE @str VARCHAR(50) SET @str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' declare @ownr_cd char(4) , @acct_date datetime , @bill_rd char(4) , @bill_rd_sffx decimal(2,0) , @ltr_stat char(1) , @tot_cba_amt decimal(9,2) , @excp_close_dt datetime , @selhead_excp_status char(1) , @rec_found char(1) declare db_cursor cursor READ_ONLY FORWARD_ONLY LOCAL FOR select RA_EXCP_ACCT_DATE ,RA_EXCP_OWNR_MRK_CD ,RA_EXCP_BILL_RD ,RAEXCP_BILL_RD_SFFX ,RAEXCP_LTR_STAT ,RAEXCP_TOTL_CBA_AMT ,RAEXCP_EXCP_CLOSE_DT from STG_R6100MU_RA_EXCP OPEN db_cursor FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt WHILE @@FETCH_STATUS = 0 BEGIN IF (@ownr_cd = 'TTX' OR @ownr_cd = 'GONX') IF EXISTS( SELECT * FROM SELHEAD WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd ) SET @rec_found = 'Y' IF EXISTS (SELECT * FROM OCR_CLIENT_CODE WHERE OCR_CLIENT_INIT =@ownr_cd) SET @rec_found = 'Y' END IF @rec_found ='Y' BEGIN IF (@ltr_stat = 'W'or @Ltr_stat = 'M' or @ltr_stat = 'X') SET @selhead_excp_status = 'C' END IF @ltr_stat = 'L' SET @selhead_excp_status = 'P' END UPDATE SELHEAD SET SELHEAD_EXCEPTION_STATUS = @selhead_excp_status ,SELHEAD_TOT_CBA_TODATE = @tot_cba_amt ,SELHEAD_DATE_CLOSED = @excp_close_dt ,SELHEAD_LAST_LOG_UPDT_BY = 342 ,SELHEAD_LAST_LOG_UPDT_ON WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd END ---END OF IF @REC_FOUND ='Y' FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt END CLOSE db_cursor DEALLOCATE db_cursor END [/code]here is the error I got:Msg 156, Level 15, State 1, Procedure sp_MakeSelheadUpdates, Line 69Incorrect syntax near the keyword 'WHERE'.Msg 156, Level 15, State 1, Procedure sp_MakeSelheadUpdates, Line 77Incorrect syntax near the keyword 'CLOSE'.Msg 102, Level 15, State 1, Procedure sp_MakeSelheadUpdates, Line 80Incorrect syntax near 'END'.Any help would be greatly appreciated as I am a novice to database programming |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-04-18 : 01:31:14
|
[code]UPDATE SELHEAD SET SELHEAD_EXCEPTION_STATUS = @selhead_excp_status ,SELHEAD_TOT_CBA_TODATE = @tot_cba_amt ,SELHEAD_DATE_CLOSED = @excp_close_dt ,SELHEAD_LAST_LOG_UPDT_BY = 342 ,SELHEAD_LAST_LOG_UPDT_ON = ? WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd [/code] KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-04-18 : 01:34:57
|
quote: Msg 102, Level 15, State 1, Procedure sp_MakeSelheadUpdates, Line 80Incorrect syntax near 'END'.
Check your BEGIN . . END. You have mismatched BEGIN and END. It should be in pairs KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
saiabhiram
Starting Member
17 Posts |
Posted - 2010-04-18 : 01:46:16
|
| Thanks for your reply. I have commented that clause in update statement. However, should a stored procedure always end with an END statement.USE [EDMSTAGE]GO/****** Object: StoredProcedure [TTXDOM01\devayb].[sp_MakeSelheadUpdates] Script Date: 04/17/2010 19:57:10 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:SAB-- Create date: 4/15/2010-- Description: Reads the Exception Extract and makes updates to SELHEAD (IMS database)-- =============================================ALTER PROCEDURE [TTXDOM01\devayb].[sp_MakeSelheadUpdates] -- Add the parameters for the stored procedure here --<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> ASBEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE @str VARCHAR(50) SET @str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' declare @ownr_cd char(4) , @acct_date datetime , @bill_rd char(4) , @bill_rd_sffx decimal(2,0) , @ltr_stat char(1) , @tot_cba_amt decimal(9,2) , @excp_close_dt datetime , @selhead_excp_status char(1) , @rec_found char(1) declare db_cursor cursor READ_ONLY FORWARD_ONLY LOCAL FOR select RA_EXCP_ACCT_DATE ,RA_EXCP_OWNR_MRK_CD ,RA_EXCP_BILL_RD ,RAEXCP_BILL_RD_SFFX ,RAEXCP_LTR_STAT ,RAEXCP_TOTL_CBA_AMT ,RAEXCP_EXCP_CLOSE_DT from STG_R6100MU_RA_EXCP OPEN db_cursor FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt WHILE @@FETCH_STATUS = 0 BEGIN IF (@ownr_cd = 'TTX' OR @ownr_cd = 'GONX') IF EXISTS( SELECT * FROM SELHEAD WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd ) SET @rec_found = 'Y' IF EXISTS (SELECT * FROM OCR_CLIENT_CODE WHERE OCR_CLIENT_INIT =@ownr_cd) SET @rec_found = 'Y' END IF @rec_found ='Y' BEGIN IF (@ltr_stat = 'W'or @Ltr_stat = 'M' or @ltr_stat = 'X') SET @selhead_excp_status = 'C' IF @ltr_stat = 'L' SET @selhead_excp_status = 'P' UPDATE SELHEAD SET SELHEAD_EXCEPTION_STATUS = @selhead_excp_status ,SELHEAD_TOT_CBA_TO_DATE = @tot_cba_amt ,SELHEAD_DATE_CLOSED = @excp_close_dt ,SELHEAD_LAST_LOG_UPDT_BY = 342 --,SELHEAD_LAST_LOG_UPDT_ON WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd END ---END OF IF @REC_FOUND ='Y' FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt END CLOSE db_cursor DEALLOCATE db_cursor --END --GO because if I comment out that end statement in end and go, the stored proc successfully compiles. Even though there is no END for the very first BEGIN. |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-04-18 : 01:56:12
|
quote: However, should a stored procedure always end with an END statement.
No. But for every BEGIN there should be an END. Check your BEGIN .. END From your last post, you might have matching BEGIN . . END, but i think the BEGIN . . END might not be in the right place.example, these are the most inner BEGIN .. END from your code. It loops while @@FETCH_STATUS = 0. You will get infinite loop as within the block of BEGIN . . END, the @@FETCH_STATUS will always be 0. WHILE @@FETCH_STATUS = 0BEGINIF (@ownr_cd = 'TTX' OR @ownr_cd = 'GONX')IF EXISTS( SELECT * FROM SELHEAD WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd )SET @rec_found = 'Y'IF EXISTS (SELECT * FROM OCR_CLIENT_CODE WHERE OCR_CLIENT_INIT =@ownr_cd)SET @rec_found = 'Y'END KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-04-18 : 02:05:28
|
your stored procedure, probably should looks like this. . .ALTER PROCEDURE [TTXDOM01\devayb].[sp_MakeSelheadUpdates] -- ADD the parameters FOR the stored PROCEDURE here --<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> ASBEGIN -- SET NOCOUNT ON added to prevent extra result sets FROM -- interfering WITH SELECT statements. SET NOCOUNT ON; DECLARE @STR varchar(50) SET @STR = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' DECLARE @ownr_cd CHAR(4) , @acct_date datetime , @bill_rd CHAR(4) , @bill_rd_sffx decimal(2,0) , @ltr_stat CHAR(1) , @tot_cba_amt decimal(9,2) , @excp_close_dt datetime , @selhead_excp_status CHAR(1) , @rec_found CHAR(1) DECLARE db_cursor cursor READ_ONLY FORWARD_ONLY LOCAL FOR SELECT RA_EXCP_ACCT_DATE ,RA_EXCP_OWNR_MRK_CD ,RA_EXCP_BILL_RD ,RAEXCP_BILL_RD_SFFX ,RAEXCP_LTR_STAT ,RAEXCP_TOTL_CBA_AMT ,RAEXCP_EXCP_CLOSE_DT FROM STG_R6100MU_RA_EXCP OPEN db_cursor FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt WHILE @@FETCH_STATUS = 0 BEGIN IF (@ownr_cd = 'TTX' OR @ownr_cd = 'GONX') IF EXISTS( SELECT * FROM SELHEAD WHERE SELHEAD_ACCT_DATE = @acct_date AND SELHEAD_COMPANY = @ownr_cd AND SELHEAD_BILLING_ROAD = @bill_rd ) SET @rec_found = 'Y' IF EXISTS (SELECT * FROM OCR_CLIENT_CODE WHERE OCR_CLIENT_INIT =@ownr_cd) SET @rec_found = 'Y' IF @rec_found ='Y' BEGIN IF (@ltr_stat = 'W'OR @Ltr_stat = 'M' OR @ltr_stat = 'X') BEGIN -- <== SET @selhead_excp_status = 'C' END IF @ltr_stat = 'L' BEGIN -- <== SET @selhead_excp_status = 'P' END UPDATE SELHEAD SET SELHEAD_EXCEPTION_STATUS = @selhead_excp_status ,SELHEAD_TOT_CBA_TODATE = @tot_cba_amt ,SELHEAD_DATE_CLOSED = @excp_close_dt ,SELHEAD_LAST_LOG_UPDT_BY = 342-- ,SELHEAD_LAST_LOG_UPDT_ON WHERE SELHEAD_ACCT_DATE = @acct_date AND SELHEAD_COMPANY = @ownr_cd AND SELHEAD_BILLING_ROAD = @bill_rd END ---END OF IF @REC_FOUND ='Y' FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt END CLOSE db_cursor DEALLOCATE db_cursor END KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
saiabhiram
Starting Member
17 Posts |
Posted - 2010-04-18 : 02:15:28
|
Thanks so much. It works. |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-04-18 : 02:22:52
|
quote: Originally posted by saiabhiram Thanks so much. It works.
Good. Now throw away the cursor method and use the set based method.ALTER PROCEDURE [TTXDOM01\devayb].[sp_MakeSelheadUpdates] ASBEGIN UPDATE a SET SELHEAD_EXCEPTION_STATUS = CASE WHEN b.RAEXCP_LTR_STAT IN ('W', 'M', 'X') THEN 'C' WHEN b.RAEXCP_LTR_STAT IN ('L') THEN 'P' END ,SELHEAD_TOT_CBA_TODATE = b.RAEXCP_TOTL_CBA_AMT ,SELHEAD_DATE_CLOSED = b.RAEXCP_EXCP_CLOSE_DT ,SELHEAD_LAST_LOG_UPDT_BY = 342 FROM SELHEAD a INNER JOIN STG_R6100MU_RA_EXCP b ON s.SELHEAD_ACCT_DATE = b.RA_EXCP_ACCT_DATE AND s.SELHEAD_COMPANY = b.RA_EXCP_OWNR_MRK_CD AND s.SELHEAD_BILLING_ROAD = b.RA_EXCP_BILL_RD WHERE b.RA_EXCP_OWNR_MRK_CD IN ( 'TTX', 'GONX' ) OR EXISTS -- not sure should the condition be OR. ( SELECT * FROM OCR_CLIENT_CODE x WHERE x.OCR_CLIENT_INIT = b.RA_EXCP_OWNR_MRK_CD )END KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
|
|
|
|
|