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 |
|
AskSQLTeam
Ask SQLTeam Question
0 Posts |
Posted - 2002-04-07 : 11:56:52
|
| Shyam Kumar N writes "I am unable to pass the dynamic table name for the cursor-----Code BeginsIf Exists(SELECT name From sysobjects Where Name = 'VoucherTrans') Drop Procedure VoucherTransGoCREATE PROCEDURE VoucherTrans @FinYear varchar(4), @DivName varchar(2),@VDate datetimeASDeclare @JoinString varchar(99)Declare @SQLString varchar(999)Declare @GDebit varchar(15)Declare @GCredit varchar(15)Declare @VStr varchar(15)Declare @PlFlag varchar(1)Declare @MonNo varchar(2)Declare @VocNo varchar(10)Declare @VNo varchar(15)Declare @DD varchar(2)Declare @MM varchar(2)Declare @YY varchar(4)Set @JoinString = @FinYear + @DivNameSet @DD = Cast(Day(@VDate) As Varchar)If Cast(@DD as numeric) < 10 Begin Set @DD = "0" + Cast(@DD As Varchar) EndSet @MM = Cast(Month(@VDate) As Varchar)If Cast(@MM as numeric) < 10 Begin Set @MM = "0" + Cast(@MM As Varchar) EndSet @YY = Cast(Year(@VDate) As Varchar)Set @VStr = @YY + @MM + @DDPrint @VStrDeclare @MaxNo varchar(15)Set @MaxNo = @VStr + "101"Set @SQLString = "SELECT ISNULL(MAX(VNO)," + @MaxNo + ") FROM FA_JV" + @JoinString + " WHERE CAST(VNO AS VARCHAR) LIKE '" + @VStr + "%'"Print(@SQLString)DECLARE VNo_Cursor CURSOR FOR Exec @SQLStringOPEN VNo_CursorFETCH NEXT FROM Vno_Cursor INTO @VocNoCLOSE VNo_CursorDEALLOCATE VNo_CursorPrint @VocNoExecute VoucherTrans '2002','TM','5-Apr-2002'---- Code EndsExec @SQLString Does not work in this context.If you have got a solution pls reply.Thank YouShyam Kumar N" |
|
|
robvolk
Most Valuable Yak
15732 Posts |
Posted - 2002-04-07 : 12:22:53
|
| A. When you DECLARE a cursor, the SELECT statement that defines that cursor must be explicitly stated, it cannot be part of a dynamic SQL string. Therefore, the entire DECLARE CURSOR statement MUST be made into a dynamic SQL string and executed.B. Even if you did that, because dynamic SQL executes in its own scope, the cursor will NOT be available to the rest of the procedure. Therefore, the ENTIRE procedure must be built as one large SQL string and executed...which is going to be pretty complicated.C. You absolutely DON'T require a cursor for this at all, and half of the variables you declared ar not necessary either. The following should work:CREATE PROCEDURE VoucherTrans @FinYear varchar(4), @DivName varchar(2), @VDate datetime AS Declare @JoinString varchar(99) Declare @SQLString varchar(999) Declare @GDebit varchar(15) Declare @GCredit varchar(15) Declare @PlFlag varchar(1) Declare @MonNo varchar(2) Declare @VocNo varchar(10) Set @SQLString = 'SELECT ISNULL(MAX(VNO),' + Convert(char(6), @Vdate, 12) + '101) FROM FA_JV' + @FinYear + @DivName + ' WHERE CAST(VNO AS VARCHAR) LIKE ''' + Convert(char(6), @Vdate, 12) + '%'''Exec @SQLStringThis will return the same results your posted code returns. I believe, however, that your code does more than this, but you did not post all of it. If that's true, and this solution does not work, please post ALL of your code so that we can modify it to work.Also, please post your table definitions (CREATE TABLE statements). It appears that you are storing voucher details in separate tables based on date and department/division. It may be far more efficient to store all voucher data in a single table, with the proper dates and department stored in columns. This not only consolidates similar data into one place, but you can write much more efficient queries that will perform much faster, and will not require dynamic SQL at all.Edited by - robvolk on 04/07/2002 12:23:35 |
 |
|
|
shyam
Starting Member
1 Post |
Posted - 2002-04-09 : 05:41:10
|
| The entire procedure is given as under.I could not combine all the entries into a single table,b'cos.The companies belong to the same group but are treated as different enties.'--------------------- Proc Starts HereCREATE PROCEDURE VoucherTransTM@FinYear varchar(4),@VDate varchar(15),@Credit varchar(15), @Debit varchar(15),@Amount varchar(20), @Narration varchar(100),@RefNo varchar(30),@VType varchar(1)ASDeclare @JoinString varchar(99)Declare @SQLString varchar(999)Declare @GDebit varchar(15)Declare @GCredit varchar(15)Declare @VStr varchar(15)Declare @PlFlag varchar(1)Declare @DivName varchar(2)Declare @MonNo varchar(2)Declare @VocNo varchar(10)Declare @VNo varchar(15)Declare @DD varchar(2)Declare @MM varchar(2)Declare @YY varchar(4)Set @DivName = "TM"Set @GDebit = Left(@Debit,10)Set @GCredit = Left(@Credit,10)Set @MonNo = Month(@Vdate)Set @DD = Cast(Day(@VDate) As Varchar)If Cast(@DD as numeric) < 10 Begin Set @DD = "0" + Cast(@DD As Varchar) EndSet @MM = Cast(Month(@VDate) As Varchar)If Cast(@MM as numeric) < 10 Begin Set @MM = "0" + Cast(@MM As Varchar) EndSet @YY = Cast(Year(@VDate) As Varchar)Set @VStr = @YY + @MM + @DDDeclare @MaxNo varchar(15)Set @MaxNo = @VStr + "100"Declare @TMonth varchar(10)Set @TMonth = @YY + @MM + "%"Set @VStr = @VStr + "%"Print "MaxNo :" + @MaxNoPrint "VStr :" + @VStrIf @FinYear = '2001'Begin DECLARE VNo_Cursor CURSOR FOR SELECT ISNULL(MAX(VNO), Cast(@MaxNo As Numeric)) FROM FA_JV2001TM WHERE CAST(VNO AS VARCHAR) LIKE @VStr DECLARE VocNo_Cursor CURSOR FOR SELECT ISNULL(MAX(VOCNO), 100) FROM FA_JV2001TM WHERE Cast(VNO As Varchar) LIKE @TMonthEnd Else If @FinYear = '2002'Begin DECLARE VNo_Cursor CURSOR FOR SELECT ISNULL(MAX(VNO), Cast(@MaxNo As Numeric)) FROM FA_JV2002TM WHERE CAST(VNO AS VARCHAR) LIKE @VStr DECLARE VocNo_Cursor CURSOR FOR SELECT ISNULL(MAX(VOCNO), 100) FROM FA_JV2002TM WHERE Cast(VNO As Varchar) LIKE @TMonthEnd Else If @FinYear = '2003'Begin DECLARE VNo_Cursor CURSOR FOR SELECT ISNULL(MAX(VNO), Cast(@MaxNo As Numeric)) FROM FA_JV2003TM WHERE CAST(VNO AS VARCHAR) LIKE @VStr DECLARE VocNo_Cursor CURSOR FOR SELECT ISNULL(MAX(VOCNO), 100) FROM FA_JV2003TM WHERE Cast(VNO As Varchar) LIKE @TMonthEnd OPEN VNo_Cursor FETCH NEXT FROM Vno_Cursor INTO @VNo CLOSE VNo_Cursor DEALLOCATE VNo_Cursor OPEN VocNo_Cursor FETCH NEXT FROM VocNo_Cursor INTO @VocNo CLOSE VocNo_Cursor DEALLOCATE VocNo_CursorSet @JoinString = @FinYear + @DivNameSet @VocNo = Cast(@VocNo As Numeric) + 1Print @VocNoPrint @VNoSet @VNo = Cast(@VNo As Numeric) + 1Print @VNoBegin TransactionSet @SQLString = "INSERT INTO FA_JV" + @JoinString + " (VNO,REFNO,VDATE,DEBIT,CREDIT,AMOUNT,NARRATION,VOCNO,VTYPE) VALUES("+ @VNo + ",'" + @RefNo +"','" + @VDate + "','" + @Debit + "','" + @Credit +"',"+ @Amount +",'"+ @Narration +"',"+ @VocNo +",'"+ @VType +"')"Print @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -100EndSet @SQLString = "UPDATE FA_LEDBAL" + @JoinString + " SET DEBIT = DEBIT+" + @Amount + " WHERE LCODE = '" + @Debit + "' AND MONNAME = " + @MonNoPrint @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -101EndSet @SQLString = "UPDATE FA_LEDBAL" + @JoinString + " SET CREDIT = CREDIT+" + @Amount + " WHERE LCODE = '" + @Credit + "' AND MONNAME = " + @MonNoPrint @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -102EndSet @SQLString = "UPDATE FA_LEDGER" + @JoinString + " SET CURBAL = CURBAL-" + @Amount + " WHERE LCODE = '" + @Credit + "'"Print @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -103EndSet @SQLString = "UPDATE FA_LEDGER" + @JoinString + " SET CURBAL = CURBAL+" + @Amount + " WHERE LCODE = '" + @Debit + "'"Print @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -104EndSet @SQLString = "UPDATE FA_GRPBAL" + @JoinString + " SET DEBIT = DEBIT+" + @Amount + " WHERE GCODE = '" +@GDebit + "' AND MONNAME = " + @MonNoPrint @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -105EndSet @SQLString = "UPDATE FA_GRPBAL" + @JoinString + " SET CREDIT = CREDIT+" + @Amount + " WHERE GCODE = '" +@GCredit + "' AND MONNAME = " + @MonNoPrint @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -106EndSet @SQLString = "UPDATE FA_GRP" + @JoinString + " SET CURBAL = CURBAL-" + @Amount + " WHERE GCODE = '" +@GCredit + "'"Print @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -107EndSet @SQLString = "UPDATE FA_GRP" + @JoinString + " SET CURBAL = CURBAL+" + @Amount + " WHERE GCODE = '" +@GDebit + "'"Print @SQLStringExec(@SQLString)If @@ERROR <> 0Begin RollBack Transaction Return -108EndDECLARE PL_Cursor CURSOR FOR SELECT PLFLAG FROM FA_PLFLAG WHERE DIVNAME = @DivName AND FINYEAR = @FinYearOPEN PL_CursorFETCH NEXT FROM PL_Cursor INTO @PlFlagCLOSE PL_CursorDEALLOCATE PL_CursorIf @PlFlag = 'Y' Begin Set @SQLString = "UPDATE FA_PLFLAG SET PLFLAG = 'Y' WHERE DIVNAME = '" + @DivName + "' AND FINYEAR = " + @FinYear Print @SQLString Exec(@SQLString) End Else Begin Set @SQLString = "INSERT INTO FA_PLFLAG (DIVNAME,FINYEAR,PLFLAG) VALUES ('" + @DivName + "'," + @FinYear + ",'Y')" Print @SQLString Exec(@SQLString) EndCommit Transaction'-----------Table StructuresCREATE TABLE [dbo].[FA_GRP2002TM] ( [GCODE] [varchar] (15) NOT NULL , [GNAME] [varchar] (50) NOT NULL , [UNDER] [varchar] (15) NULL , [OPBAL] [numeric](20, 2) NOT NULL , [CURBAL] [numeric](20, 2) NOT NULL )GOCREATE TABLE [dbo].[FA_GRPBAL2002TM] ( [GCODE] [varchar] (15) NOT NULL , [MONNAME] [smallint] NOT NULL , [CREDIT] [numeric](20, 2) NOT NULL , [DEBIT] [numeric](20, 2) NOT NULL )GOCREATE TABLE [dbo].[FA_JV2002TM] ( [VNO] [numeric](15, 0) NOT NULL , [VOCNO] [numeric](18, 0) NULL , [VDATE] [datetime] NOT NULL , [VTYPE] [char] (1) NULL , [DEBIT] [varchar] (15) NOT NULL , [CREDIT] [varchar] (15) NOT NULL , [AMOUNT] [numeric](20, 2) NOT NULL , [REFNO] [varchar] (30) NULL , [NARRATION] [varchar] (100) NULL )GOCREATE TABLE [dbo].[FA_LEDBAL2002TM] ( [LCODE] [varchar] (15) NOT NULL , [MONNAME] [smallint] NOT NULL , [DEBIT] [numeric](20, 2) NOT NULL , [CREDIT] [numeric](20, 2) NOT NULL )GOCREATE TABLE [dbo].[FA_LEDGER2002TM] ( [LCODE] [varchar] (15) NOT NULL , [GCODE] [varchar] (15) NOT NULL , [LNAME] [varchar] (50) NOT NULL , [OPBAL] [numeric](20, 2) NOT NULL , [CURBAL] [numeric](20, 2) NOT NULL , [SLCODE] [varchar] (6) NULL )GOCREATE TABLE [dbo].[FA_PLFLAG] ( [DIVNAME] [varchar] (2) NOT NULL , [FINYEAR] [numeric](4, 0) NOT NULL , [PLFLAG] [char] (1) NOT NULL ) ON [PRIMARY]GO |
 |
|
|
|
|
|
|
|