2006-09-29

在 MS SQL Server 中限制返回记录数量的 3 种方法

在使用海量数据的时候,限制返回记录的数量是必须的,将所有记录返回很容易使数据库陷入死状态。

对于 Microsoft SQL Server 来说,提供了3种方法来完成这个功能:

1. 使用 TOP 选项。TOP 选项提供了最简单的方式限制返回记录数量,语法如下:

SELECT [ TOP (expression) [ PERCENT ] [ WITH TIES ]] select_list [ other_select_command ]

参数

1. expression. 指定返回行数量的数值,可以是常量或者变量。如果指定了 PERCENT ,则 expression 将转换为 float 类型;如果没有指定 PERCENT ,则 expression 将转换为 bigint 类型。如果查询中包含 ORDER BY 子句,则返回的记录集为排序后的前项记录;如果没有包含 ORDER BY 子句,则返回行的顺序是随意的。

2. PERCENT. 指示限定记录数量的类型。如果指定了 PERCENT ,则按照总数量的百分比计算返回数量;如果没有指定 PERCENT , 则按照返回记录集的行数量来计算。

3. WITH TIES. 指示返回额外的行,只能与 ORDER BY 一起使用。使用此选项时,排序后返回指定数量的记录行,与这些记录集最后一行排序字段相同的行也会返回。所以,返回记录的数量可能会比指定数量要大。

示例代码

SELECT TOP (10) * FROM table1 ORDER BY column1

2. 使用 SET ROWCOUNT 选项。 SET ROWCOUNT 改变了当前环境下返回记录数量的值,语法如下:

SET ROWCOUNT expression

参数

1. expression. 在停止特定查询之前要处理的行数,可以是常量或变量,类型为整形。

执行此命令后, SQL Server 将在执行 SELECT 语句时,返回指定的行数后停止查询。如果需要关闭此选项,执行 SET ROWCOUNT 0 即可。

示例代码

SET ROWCOUNT 10
SELECT * FROM table1 ORDER BY column1
SET ROWCOUNT 0

3. 使用 ROW_NUMBER 函数。 ROW_NUMBER 函数返回当前行对应的行号,每个分区的第一行从 1 开始,语法如下:

ROW_NUMBER ( ) OVER ( [ PARTITION BY partition_name [ , partition_name ] ] ORDER BY order_name [ , order_name ] )

参数

1. partition_name. 根据此列名确认 ROW_NUMBER 函数结果集分区范围。如果此字段未填,则所有计算行号;如果此字段填写,则根据相同结果集分区的记录计算行号,结果集分区不同的记录重新从1开始计算行号。

2. order_name. 根据此列名确定返回行的顺序,计算出行号。

示例代码

SELECT * FROM ( SELECT *, ROW_NUMBER ( ) OVER ( ORDER BY column1 ) AS rowNumber FROM table1 ) AS T WHERE rowNumber < 10

上面列出了 SQL Server 限制返回记录数量的 3 种方法,这 3 种方法均支持常量和变量。 TOP 的使用方法最简单,如果仅仅是限制返回数量,建议使用这种方式;如果要进行分页和结果集分区计算,那么就要使用 ROW_NUMBER 函数了。

0 Comments: