在SQL Server中选择所有记录或最高动态记录数

时间:2014-04-11 11:46:43

标签: sql sql-server

我有一个像

这样的查询
DECLARE @TOP VARCHAR(10) = '10'

我需要从像

这样的表中选择top @top值

我用过

select top (convert(int,@top)) * from <table>

但我的问题是@top值可能具有值&#39; ALL&#39;也。那个时候这个查询是不可能的。无论@top的值是什么(&#39;全部&#39;或价值)

,请建议查询以返回结果

5 个答案:

答案 0 :(得分:1)

您可以使用动态SQL执行此操作:

DECLARE @TOP NVARCHAR(10)= N'10'

declare @sql as nvarchar(max) = N'select '
if @top <> N'ALL'
    set @sql = @sql + N'top ' + @top
set @sql = @sql + N' * from table1'

exec sp_executesql @sql

答案 1 :(得分:1)

也许这个解决方案可以帮到你:

declare @top varchar(10) 
set @top = 'all'

select top(case @top when 'all' then 1000000 else cast(@top as int) end)
    *
from MyTable

值1000000是随机值,您可以设置最大整数值以确保获取所有行。

答案 2 :(得分:1)

为避免额外的复杂情况,请运行以下两个查询之一:

IF @Top = 'All'
BEGIN
     SELECT *
       FROM <table>
END
ELSE
BEGIN
     SELECT TOP CAST(@Top AS INT) *
       FROM <table>
END

在键入文本方面需要很小的开销,以便将来更容易阅读代码。

如果没有其他方法,动态查询很有用,但显式查询更适合将来的理解和性能方面(在构造查询之前无法确定执行计划)。

稍微好一点的方法是使用INT变量,0表示ALL,并且不要求CAST / CONVERT变量。

答案 3 :(得分:1)

试试这个

DECLARE @TOP NVARCHAR(100) = 'ALL'
IF @TOP = 'ALL' SET @TOP = '100 PERCENT '
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'SELECT TOP '+@TOP+' * FROM table_name' 
EXEC(@SQL)

答案 4 :(得分:0)

与@ Veljasije的答案类似,但避免使用任意数字。如果你知道你的数据,那么你应该按照他的建议选择一个大数据。

DECLARE @top VARCHAR(10) = 'all'
SELECT TOP (CASE @top 
                 WHEN 'all' THEN (SELECT COUNT(*) FROM Orders) 
                 ELSE CAST(@top AS BIGINT) 
            END) 
       * 
  FROM Orders

但是,我喜欢使用max INT的想法,但TOP需要一个BIGINT,所以你想要它。我试过了:

DECLARE @top VARCHAR(10) = 'all'
SELECT TOP (CASE @top 
                 WHEN 'all' THEN 9223372036854775807 
                 ELSE CAST(@top AS BIGINT) 
            END) 
       * 
  FROM Orders

那出乎意料的错误:

  

Msg 1060,Level 15,State 1,Line 34为a提供的行数   TOP或FETCH子句行计数参数必须是整数

然而这项工作:

SELECT TOP (9223372036854775807) * FROM Orders

所以我很困惑。如果有人能在这里提供见解,那很好,否则我可能就此提出一个问题。