You are on page 1of 3

Method 1: Temp table with identity column In the allow e sure g file lure.

first approach, we will use a temp table with an identity column added to for row-by-row selection. If you're performing an INSERT/UPDATE/DELETE, b to use the explicit transactions. This vastly reduces the load on your lo by committing per loop, and it prevents huge rollbacks in the case of fai

set nocount on declare @i int --iterator declare @iRwCnt int --rowcount declare @sValue varchar(100) set @i = 1 --initialize create table #tbl(ID int identity(1,1), Value varchar(100)) insert into #tbl(Value) select name from master..sysdatabases (nolock) set @iRwCnt = @@ROWCOUNT --SCOPE_IDENTITY() would also work create clustered index idx_tmp on #tbl(ID) WITH FILLFACTOR = 100 /* Always do this after the insert, since it's faster to add the index in bulk than to update the index as you write into the temp table. Since you know the data i n this column, you can set the fill factor to 100% to get the best read times. */ while @i <= @iRwCnt begin select @sValue = Value from #tbl where ID = @i --begin tran print 'My Value is ' + @sValue --replace with your operations on this value --commit tran set @i = @i + 1 end drop table #tbl Method 2: Temp table without ID In the second approach, we use a temp table without an identity column and simpl y grab the top row to process, then loop until we find no more rows to process. If you're performing an INSERT/UPDATE/DELETE, again, be sure to use the explicit transactions to vastly reduce the load on your log file by committing per loop, which prevents huge rollbacks in the case of failure. set nocount on declare @i int --iterator declare @iRwCnt int --rowcount declare @sValue varchar(100) set @i = 1 --initialize create table #tbl(Value varchar(100))

insert into #tbl(Value) select name from master..sysdatabases (nolock) set @iRwCnt = @@ROWCOUNT --SCOPE_IDENTITY() would also work create clustered index idx_tmp on #tbl(Value) WITH FILLFACTOR = 100 /* Always do this after the insert, since it's faster to add the index in bulk than to update the index as you write into the temp table. Since you know the data i n this column, you can set the fill factor to 100% to get the best read times. */ while @iRwCnt > 0 begin select top 1 @sValue = Value from #tbl set @iRwCnt = @@ROWCOUNT --ensure that we still have data if @iRwCnt > 0 begin --begin tran print 'My Value is ' + @sValue --replace with your operations on this value --commit tran delete from #tbl where value = @sValue --remove processed record end end drop table #tbl Method 3: Selecting a comma-delimited list of items When most developers/DBAs are asked to come up with a list of comma-delimited va lues from a table, they typically use a cursor or temp table (as above) to loop through the records. However, if you do not need to use a GROUP BY or an ORDER B Y, then you can use the method below that operates in batch to handle the task. This cannot be used with GROUP BY DISTINCT, or ORDER BY, because of how SQL Serv er handles those operations. Basically, this takes a given variable, and for every row in the table it adds t he current value to the variable along with a comma. declare @vrs varchar(4000) declare @sTbl sysname set @sTbl = 'TableName' set @vrs = '' select @vrs = @vrs + ', ' + name from syscolumns where id = (select st.id from sysobjects as st where name = @sTbl) order by colorder set @vrs = right(@vrs, len(@vrs)-2) print @vrs DECLARE @StudentID char(11); DECLARE crs CURSOR READ_ONLYFORSELECT student_idFR OM studentsOPEN crsFETCH NEXT FROM crsINTO @StudentIDWHILE @@FETCH_STATUS = 0BEG IN PRINT @StudentID FETCH NEXT FROM crs INTO @StudentIDENDCLOSE crsDEALLOCATE crsThe definitions for the terminology are :DECLARE CURSOR

this statement defines the SELECT statement that forms the basis of the curs or. You can do just about anything here that you can do in a SELECT statement. OPEN statement executes the SELECT statement and populates the result set. FETCH statement returns a row from the result set into the variable. You can select multiple columns and return them into multiple variables. The variable @@FETCH_STATUS is used to determine if there are any more rows. It will contain 0 as long as there are more rows. We use a WHILE loop to move through each row of the result set. READ_ONLY clause is important in the code above. That improves the performance of the cursor. CLOSE statement releases the row set DEALLOCATE statement releases the resources associated with a cursor.

You might also like