SQL Server中的动态SELECT TOP @var


308

如何使用动态变量设置要在SQL Server中返回的行数?以下是SQL Server 2005+中的无效语法:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable

2
您正在运行SQL 2005或2008吗?
布赖恩·金

当前正在运行SQL Server 2005
eddiegroves

Answers:


561
SELECT TOP (@count) * FROM SomeTable

这仅适用于SQL 2005+


52
我也总是忘记括号。
约翰·希恩

14
这很棒!一直以来,我都认为我必须使用动态sql。
拉古纳

1
还有谁还能通过不添加括号来实现查询中的愚蠢错误?
拉加夫

你救了我的一天!我以为只将其移至动态查询!
Altaf Patel

41

语法“选择顶部(@var)...”仅在SQL SERVER 2005+中有效。对于SQL 2000,您可以执行以下操作:

set rowcount @top

select * from sometable

set rowcount 0 

希望这可以帮助

爱信

(编辑后用行数替换@@ rowcount-谢谢augustlights)


1
我听说如果您有多列主键,则@@ RowCount可能会得到错误的行号。真的吗?
布赖恩·金


4

也可以使用动态SQL并通过exec命令执行它:

declare @sql  nvarchar(200), @count int
set @count = 10
set @sql = N'select top ' + cast(@count as nvarchar(4)) + ' * from table'
exec (@sql)

8
但是请(非常)谨慎使用这种方法进行SQL注入攻击
MadSkunk 2015年

4

或者您只是将变量放在括号中

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;

4
declare @rows int = 10

select top (@rows) *
from Employees
order by 1 desc -- optional to get the last records using the first column of the table
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.