Processing Sequentially Through a Set of Records

November 19, 2003
T-SQL Programming Part 3 - Processing Sequentially Through a Set of Records
By Gregory A. Larsen

At some point you will have some business logic that will require you to process sequentially through a set of records one record at a time. For example you may have a list of databases, and for each database you may want to build a command that will perform some process against each database. Or you might have a set of records where you want to process through each record one at a time, so you can select additional information from another table based on the information contained in each record. This article will discuss two different ways to process through a set of records one record at a time.
Using a Cursor
The first method I will discuss uses a cursor to process through a set of records one record at a time. A cursor is basically a set of rows that you define based on a record set returned from a query. A cursor allows applications a mechanism to process through a result set one row at a time. With a cursor an application is allowed to position itself to a specific row, scroll back and forth, and a number of other things. It would take a series of articles to describe all the functionality of a cursor. For the purpose of this article I'm only going to focus on how to use the default scrolling functionality of a cursor. This default functionality will only read from the first row to the last row in a cursor, one row at a time. I will leave additional cursor topics to another article series.

To define a cursor the DECLARE CURSOR statement is used. Here is the basic format for the simple cursor topic I will be discussing in this article.

DECLARE cursor_name CURSOR FOR select_statement

The cursor_name is the name you want to associate with the cursor. The select_statement is the query that will determine the rows that make up the cursor. Note there are other parameters/options associated with the DECLARE CURSOR statement that help define more complicated cursor processing than I will be covering in this article. For these additional options please read Microsoft SQL Server Books Online.

Let's review a fairly simple cursor example. This example will define a cursor that contains the top 5 Customer_Id's in the Customer table in the Northwind database. It will then process through each record displaying a row number and the CustomerID for each. Here is the code to do this.

declare @CustId nchar(5)declare @RowNum intdeclare CustList cursor forselect top 5 CustomerID from Northwind.dbo.CustomersOPEN CustListFETCH NEXT FROM CustList INTO @CustIdset @RowNum = 0 WHILE @@FETCH_STATUS = 0BEGIN set @RowNum = @RowNum + 1 print cast(@RowNum as char(1)) + ' ' + @CustId FETCH NEXT FROM CustList INTO @CustIdENDCLOSE CustListDEALLOCATE CustList

Here are the results that are generated from the print statement when I run it against my Northwind Database.

1 ALFKI2 ANATR3 ANTON4 AROUT5 BERGS

Let's look at the above code in a little more detail. I first declared a cursor called "CustList". The "CustList" cursor is populated using a SELECT statement that uses the TOP clause to return only the top 5 CustomerId's. Next the cursor is opened. Each record in the "CustList" cursor is retrieved, one record at a time, using the "FETCH NEXT" next statement. The "FETCH NEXT" statement populates the local variable @CustID with the CustomerID of the current record being fetched. The @@FETCH_STATUS variable controls whether the WHILE loop is executed. @@FETCH_STATUS is set to zero when a record is successfully retrieved from the cursor "CustList". Inside the WHILE loop the @RowNum variable is incremented by 1 for each record processed. The calculated Row Number and @CustId are then printed out. Lastly, a "FETCH NEXT" statement is used to retrieve the next row before the next cycle of the WHILE loop. This process continues one record at a time until all records in cursor "CustList" have been processed.
Using a Select Statement
You can also use a SELECT statement to process through a set of records one record at a time. To do this I will issue an initial SELECT statement that will return the first row, then a series of follow on SELECT statements where each SELECT statement retrieves the next row. This is done by using the "TOP 1" clause of the SELECT statement, and a WHERE statement.

I will use the same example as above and only return the top 5 CustomerID's from the Northwind database Customers table. In this code I will use two different "SELECT TOP 1" statements and a WHILE loop to return all 5 records. Each record will be processed one at a time.

declare @CustId nchar(5)declare @RowNum intselect top 1 @CustId=CustomerID from Northwind.dbo.Customersset @RowNum = 0 WHILE @RowNum < 5BEGIN set @RowNum = @RowNum + 1 print cast(@RowNum as char(1)) + ' ' + @CustId select top 1 @CustId=CustomerID from Northwind.dbo.Customers where CustomerId > @CustIDEND

Here you can see the first SELECT statement selects only the first CustomerID. This ID is placed in the local variable @CustID. The WHILE loop is controled by the local variable @RowNum. Each time through the WHILE loop, the Row Number and CustomerID are printed out. Prior to returning to the top of the WHILE loop I used another "SELECT TOP 1" statement to select the next CustomerID. This SELECT statement uses a WHERE clause on the SELECT statement to select the first CustomerID that is greater than the CustomerID that was just printed. The WHILE loop is process 5 times, allowing the SELECT TOP 1 method to retrieve the top 5 CustomerID's one records at a time. This example produces the same printed output as my prior CURSOR example.
Conclusion
Hopefully this article has given you some ideas on how to use a CURSOR, and a SELECT statement to process through a set of records. I use both of these methods, although I find using a SELECT statement to be a little simpler to code. You will need to decide which solution makes the most sense in your environment.

时间: 2024-09-17 03:21:55

Processing Sequentially Through a Set of Records的相关文章

XML document processing in Java using XPath and XSLT

XML document processing in Java using XPath and XSLT More like this XSL gives your XML some style Easy Java/XML integration with JDOM, Part 2 Easy Java/XML integration with JDOM, Part 1 Discover how XPath and XSLT can significantly reduce the complex

MillWheel: Fault-Tolerant Stream Processing at Internet Scale

为什么要做MillWheel? 因为当前的其他的流式系统,无法同时满足 fault tolerance, versatility, and scalability 的需求. Spark Streaming [34] and Sonora [32] do excellent jobs of efficient checkpointing, but limit the space of operators that are available to user code. S4 [26] does n

Beginner: Using Servlets to display, insert and update records in database.(1)

servlet Displaying Records from the Database with Java Servlets. Overview : In this article I'll explain each step you need to know to display records from the database using Servlets. The steps for displaying records in JSP pages and Java Beans are

In-Stream Big Data Processing译文:流式大数据处理

转自:http://blog.csdn.net/idontwantobe/article/details/25938511  @猪头饼 原文:http://highlyscalable.wordpress.com/2013/08/20/in-stream-big-data-processing/ 作者:Ilya Katsov 相当长一段时间以来,大数据社区已经普遍认识到了批量数据处理的不足.很多应用都对实时查询和流式处理产生了迫切需求.最近几年,在这个理念的推动下,催生出了一系列解决方案,Twi

解决方法:An error occurred on the server when processing the URL. Please contact the system administrator

  在WINDOWS7或SERVER2008上安装了IIS7.5,调试ASP程序时出现以下错误: An error occurred on the server when processing the URL. Please contact the system administrator 解决方法如下: 设置方法一: 以管理员身份运行CMD,将目录定位到%windir%system32inetsrv,然后执行appcmd set config -section:asp -scriptError

Beginner: Using Servlets to display, insert and update records in database.(3)

servlet Updating records in the Database with Java Servlets. Overview : This article is next in the series of articles about selecting, inserting, updating and deleting records from the database using JDBC. In this article we will learn how to update

Beginner: Using Servlets to display, insert and update records in database.(2)

servlet Inserting records into the Database with Java Servlets. Overview : This article is next in the series of articles about selecting, inserting, updating and deleting records from the database using JDBC. In this article we will learn how to ins

Counting Records in an SQL Table by G.F. Weis Gfw

Counting Records in an  SQL Table by G.F. Weis Gfw -------------------------------------------------------------------------------- I was working on a project using my C# Class Generator  and realized that I had no way to get a count of the number of

如何解决linux下dpkg: error processing install-info

 代码如下: 正在设置 install-info (5.2.0.dfsg.1-2) ... /etc/environment: line 2: CLASS_PATH: command not found dpkg: error processing package install-info (--configure): 子进程 已安装 post-installation 脚本 返回了错误号 127 E: Sub-process /usr/bin/dpkg returned an error co