变量为最高值

时间:2011-02-10 14:14:53

标签: sql sql-server sql-server-2005 tsql

原始问题:

declare @num as int set @num = 5

select top @num col1, col2 from table1

以上不起作用。它不喜欢以这种方式使用@num。需要做什么,以便我可以在top命令旁边有一个变量值?

它给出错误:

  

'@num'附近的语法不正确

8 个答案:

答案 0 :(得分:10)

SELECT TOP (@num) a FROM table

从SQL Server 2005开始,支持参数化TOP。

答案 1 :(得分:5)

SQL Server 2000以后:

declare @num as int 
set @num = 5  

SET ROWCOUNT @num 

select col1, col2 from table1 

SET ROWCOUNT 0 

更新:实际上,你确定这不起作用(我没有2005实例):

declare @num as int 
set @num = 5  

select TOP (@num) col1, col2 from table1 
-- Implictly in clustered index order...

答案 2 :(得分:4)

在括号中

declare @num as int set @num = 5

select top (@num) col1, col2 from table1

答案 3 :(得分:3)

您必须将变量包装在括号中

declare @num int 

set @num = 5

select top (@num) col1, col2 from table1

答案 4 :(得分:0)

使用字符串连接和sp_executesql是实现这一目的的一种方法......

将@num声明为int set @num = 5

declare @sql varchar(255)
select @sql = 'select top ' + @num + ' col1, col2 from table1'
sp_executesql @sql

答案 5 :(得分:0)

试试这个:

DECLARE @num AS INT 
DECLARE @SQL AS NVARCHAR(MAX) 
SET @num = 5  
SET @SQL = N'select top ' + CAST(@num AS VARCHAR(5)) + ' col1, col2 from table1'
EXECUTE sp_executesql @SQL

答案 6 :(得分:0)

尝试使用动态SQL

类似这样的事情

declare @dynamicsql nvarchar(4000);
declare @num as int;
set @num = 5

set @dynamicsql = 'select top ' + convert(nvarchar, @num) + ' col1, col2 from table1';
exec @dynamicsql;

答案 7 :(得分:-1)

您需要使用动态SQL,或者您可以重写整个SQL以使用某种ROWNUMBER技巧,而不确定哪一种最佳性能。

对于“动态SQL”,您需要在字符串中构建SQL然后执行它。

有关详细信息,请参阅here