2009-08-14 25 views
43

尝试在我的sql语句中参数化TOP的值。C#SQL Top作为参数

SELECT TOP @topparam * from table1 

command.Parameters.Add("@topparam",SqlDbType.VarChar, 10).Value = somevalue.ToString(); 

这似乎并不奏效。任何人有任何建议?
只是为了澄清,我不想使用存储过程。

回答

64

SQL Server 2005 and above,你可以这样做:

SELECT TOP (@topparam) * from table1 
+0

这使我回答了我的答案。我通过varchar传递值,切换到int修复它。谢谢大家。 – muhan 2009-08-14 01:00:45

+0

这正是我所期待的,谢谢! – ActionOwl 2011-02-09 15:29:32

+0

有没有办法将@topparam设置为一个值,这意味着它忽略TOP并返回所有行? – 2017-10-04 15:09:20

0

你可以写一联查询:

EXEC 'SELECT TOP' + @topparam + '* FROM ...'

解析它作为一个int,这将防止SQL注入攻击。

8

你需要有至少SQL Server 2005的这段代码在2005/8例如正常工作......

DECLARE @iNum INT 
SET @iNum = 10 
SELECT TOP (@iNum) TableColumnID 
FROM TableName 

如果你有SQL Server 2000,试试这个...

CREATE PROCEDURE TopNRecords 
@intTop INTEGER 
AS 
SET ROWCOUNT @intTop 

SELECT * FROM SomeTable 

SET ROWCOUNT 0 
GO