Переменная как верхнее значение - PullRequest
2 голосов
/ 10 февраля 2011

ОРИГИНАЛЬНЫЙ ВОПРОС:

declare @num as int set @num = 5

select top @num col1, col2 from table1

Выше не работает. Не нравится, когда @num используется таким образом. Что нужно сделать, чтобы я мог иметь значение переменной рядом с верхней командой?

выдает ошибку:

Неверный синтаксис рядом с '@ num'

Ответы [ 8 ]

10 голосов
/ 10 февраля 2011
SELECT TOP (@num) a FROM table

SQL Server 2005 и выше, это поддерживается для параметризации TOP.

5 голосов
/ 10 февраля 2011

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...
4 голосов
/ 10 февраля 2011

в скобках

declare @num as int set @num = 5

select top (@num) col1, col2 from table1
3 голосов
/ 10 февраля 2011

Вы должны заключить переменную в скобки

declare @num int 

set @num = 5

select top (@num) col1, col2 from table1
0 голосов
/ 10 февраля 2011

попробуйте использовать динамический 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;
0 голосов
/ 10 февраля 2011

Попробуйте это:

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
0 голосов
/ 10 февраля 2011

Вам нужно использовать динамический SQL, или вы можете переписать весь SQL, чтобы использовать какой-то трюк ROWNUMBER, не зная, какой из них будет лучшим с точки зрения производительности.

Для «динамического SQL» вам нужно собрать SQL в строку и затем выполнить его.

Подробнее см. здесь .

0 голосов
/ 10 февраля 2011

Использование конкатенации строк и sp_executesql - один из способов добиться этого ...

объявить @num как int set @num = 5

declare @sql varchar(255)
select @sql = 'select top ' + @num + ' col1, col2 from table1'
sp_executesql @sql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...