Eric Barro
ebarro at verizon.net
Thu Feb 22 12:51:55 CST 2007
Cursors are really slow and you should generally avoid them. If for some reason you need to use cursors they need to be FAST FORWARD cursors. I use a variation of this code fragment to get around cursors. You basicaly create a temp table (in the example below it's a table variable instead of a temp table) and insert the primary key of the table you want to process. You then determine how many records you processed and then you loop thru those records and run your main sql process inside of that loop. /*Prepare TABLE variable to take resultset it's important to declare an identity field since we will use this as part of our criteria later on */ DECLARE @tbl TABLE ( tbl_RowID INT IDENTITY(1, 1), tbl_ObjectID INT ) /*Local variables */ DECLARE @ObjectID INT, @count int, /*create local @@fetch_status*/ @iRow int /*row pointer (index)*/ /* create array simulator */ INSERT @tbl (tbl_ObjectID) /* get the recordset and stuff the values into the array */ SELECT ObjectID FROM MySQLTable /*get array Upper Bound (highest ID number)*/ SET @count = @@ROWCOUNT /*initialize index counter*/ SET @iRow = 1 /*establish loop structure*/ WHILE @iRow <= @count BEGIN /*get row values*/ SELECT @ObjectID = tbl_ObjectID FROM @tbl WHERE tbl_RowID = @iRow /* INSERT MAIN SQL CODE HERE */ /*uncomment line below for debugging*/ --PRINT 'Retreiving record #' + RTRIM(CAST(@iRow as char)) /*go to next row*/ SET @iRow = @iRow + 1 END -----Original Message----- From: dba-sqlserver-bounces at databaseadvisors.com [mailto:dba-sqlserver-bounces at databaseadvisors.com] On Behalf Of David Lewis Sent: Thursday, February 22, 2007 10:33 AM To: dba-sqlserver at databaseadvisors.com Subject: Re: [dba-SQLServer] Advancing in SQL Server Paul: Yes, it looks to me like you need a cursor. You can run the sql statements within the cursors, or you can call sp's. Below is some quickie sample code: DECLARE CurB CURSOR FOR SELECT DISTINCT m.fldDate, m.Brand, m.Type FROM tblRptLiaDaily M WHERE m.packageid is null DECLARE @BlDate datetime DECLARE @BlBrand char(3) DECLARE @BlType char(1) OPEN CurB FETCH NEXT FROM CurB INTO @BlDate, @BlBrand, @BlType WHILE @@FETCH_STATUS=0 BEGIN EXEC usp_xyz @BlDate=@BlDate, @BlBrand=@BlBrand, at BlType=@BlType --OR do any number of other things. FETCH NEXT FROM CurB INTO @BlDate, @BlBrand, @BlType END CLOSE CurB DEALLOCATE CurB ---------------------------------------------------------------------- Message: 1 Date: Thu, 22 Feb 2007 13:06:40 +0100 (CET) From: paul.hartland at fsmail.net Subject: [dba-SQLServer] Advancing in SQL Server To: accessd <accessd at databaseadvisors.com>, SQL Group <dba-sqlserver at databaseadvisors.com> Message-ID: <12660593.1538681172146000895.JavaMail.www at wwinf3004.me-wanadoo.net> Content-Type: text/plain; charset=UTF-8 To all, I know how to write basic stored procedures etc, but I want to know if the following is possible. I have the code below in Visual Basic: Dim rsOnJob As ADODB.Recordset Dim rsNew As ADODB.Recordset Dim rsDupe As ADODB.Recordset Set rsOnJob = New ADODB.Recordset rsOnJob.CursorLocation = adUseClient rsOnJob.Open ("SELECT PayrollNo FROM tblAvailabilityAll WHERE JobNo = '" & PublicJobNumber & "'"), DESQLGenesis.SQLConn, adOpenDynamic, adLockReadOnly If (rsOnJob.RecordCount > 0) Then With rsOnJob .MoveFirst Do Until (.EOF) Set rsNew = DESQLGenesis.SQLConn.Execute("genesis_select_NewStarterNotification '" & .Fields("PayrollNo") & "'") If (rsNew.RecordCount > 0) Then Set rsDupe = DESQLGenesis.SQLConn.Execute("genesis_select_DupeInNewStarter '" & rsNew.Fields("PayrollNo") & "'") If (rsDupe.RecordCount < 1) Then DESQLGenesis.SQLConn.Execute ("genesis_insert_NewStarters '" & rsNew.Fields("PayrollNo") & "', '" & rsNew.Fields("Fullname") & "', '" & Format(rsNew.Fields("StartDate"), "MM/DD/YY") & "', '" & rsNew.Fields("JN") & "', '" & Format(rsNew.Fields("JD"), "MM/DD/YY") & "'") End If rsDupe.Close Set rsDupe = Nothing End If rsNew.Close Set rsNew = Nothing .MoveNext Loop End With End If rsOnJob.Close Set rsOnJob = Nothing Does anyone know if it is possible to put this into either a stored procedure or a user defined function enabling me to just make a call to the one stored procedure of function ? Thanks in advance for any help on this. Paul Hartland paul.hartland at fsmail.net 07730 523179 ------------------------------ _______________________________________________ dba-SQLServer mailing list dba-SQLServer at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/dba-sqlserver End of dba-SQLServer Digest, Vol 48, Issue 18 ********************************************* _______________________________________________ dba-SQLServer mailing list dba-SQLServer at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/dba-sqlserver http://www.databaseadvisors.com -- No virus found in this incoming message. Checked by AVG Free Edition. Version: 7.5.441 / Virus Database: 268.18.3/697 - Release Date: 2/22/2007 11:55 AM