2009-08-14 13 views
43

Próba sparametryzowania wartości TOP w mojej instrukcji sql.C# SQL Top jako parametr

SELECT TOP @topparam * from table1 

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

To nie działa. Czy ktoś ma jakieś sugestie?
Aby wyjaśnić, nie chcę używać procedur przechowywanych.

Odpowiedz

64

W SQL Server 2005 and above, można to zrobić:

SELECT TOP (@topparam) * from table1 
+0

To doprowadziło mnie do mojej odpowiedzi. Przekazywałem wartość jako varchar, przełączając na int to naprawiłem. Dziękuje wszystkim. – muhan

+0

To jest dokładnie to, czego szukałem, dzięki! – ActionOwl

+0

Czy istnieje sposób ustawienia @topparam na wartość, która oznacza, że ​​ignoruje TOP i zwraca wszystkie wiersze? –

0

Można napisać kwerendę inline:

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

analizować je jako int i które będą zapobiegać ataku SQL injection.

8

Musisz mieć co najmniej SQL Server 2005. Ten kod działa poprawnie w 2005/8 na przykład ...

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

Jeśli masz SQL Server 2000, wypróbuj to ...

CREATE PROCEDURE TopNRecords 
@intTop INTEGER 
AS 
SET ROWCOUNT @intTop 

SELECT * FROM SomeTable 

SET ROWCOUNT 0 
GO