我有一个像
这样的查询DECLARE @TOP VARCHAR(10) = '10'
我需要从像
这样的表中选择top @top值我用过
select top (convert(int,@top)) * from <table>
但我的问题是@top
值可能具有值&#39; ALL&#39;也。那个时候这个查询是不可能的。无论@top
的值是什么(&#39;全部&#39;或价值)
答案 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
所以我很困惑。如果有人能在这里提供见解,那很好,否则我可能就此提出一个问题。