我想动态使用TOP或者不是这样......
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
答案 0 :(得分:17)
我希望能够理解你的问题:如果传递@SomeNumber = 0,你想选择TOP 5行,否则选择所有可行的行
作为第一个直接实现,你可以做类似的事情
declare @SomeNumber as int
set @SomeNumber = 5
-- set @SomeNumber = 1
SELECT TOP (SELECT @SomeNumber) COLUMNNAME FROM MYTABLE
您可以更改参数值,以便拥有所需的行数
否则我建议你实现一个存储过程(也许你已经这样做了,否则你可以按照下面的步骤去做)
CREATE procedure [dbo].[TOPCLAUSE]
-- clause parameter
@SomeNumber as integer
AS
IF @SomeNumber = 0
BEGIN
SELECT TOP 5 COLUMNNAME FROM MYTABLE
END
ELSE
BEGIN
SELECT COLUMNNAME FROM MYTABLE
END
GO
然后你可以打电话
exec [dbo].[TOPCLAUSE] 0
exec [dbo].[TOPCLAUSE] 1
我可能没有回答你的问题但请告诉我是否有帮助
答案 1 :(得分:4)
我认为你不能。
您可以使用动态SQL:
Declare @int int
set @int = 10
exec ('Select top ' + @int + ' * From Customers')
或者您可以设置rowcount
if (@someNumber != 0)
begin
set rowcount 5
end
select * From Customers
set rowcount 0
答案 2 :(得分:2)
我刚刚使用过这样的东西: -
Declare @SQL nvarchar(max), @Params nvarchar(max)
set @Params = N''
Set @SQL = N'SELECT ' + Cast(@SomeNumber as varchar) + ' CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE'
exec sp_executesql @SQL, @Params
答案 3 :(得分:1)
简短的回答是否定的,不是你拥有它的方式。
但是,您可以使用IF
来测试并运行其他查询:
IF (@SomeNumber = 0)
BEGIN
SELECT TOP 5 ColumnName FROM Table
END
ELSE
BEGIN
SELECT ColumnName FROM Table
END
答案 4 :(得分:1)
两个选项:条件SQL或动态SQL。
(1)有条件:
IF @SomeNumber = 0
SELECT TOP 5 COLUMNAME FROM TABLE
ELSE
SELECT COLUMNAME FROM TABLE
(2)动态:在varchar()中构建查询并将其传递给sp_execute
答案 5 :(得分:1)
另一个漏洞:使用带有row_number函数的子查询
DECLARE @DoTopJN AS bit
SET @DoTopJN = 0 -- or 1
SELECT X.Sequence
X.COLUMNA
--etc
FROM (SELECT ROW_NUMBER() OVER (ORDER BY Y.Code) AS Sequence
,Y.COLUMNA
,Y.COLUMNB
-- etc.
FROM Y) X
WHERE ((@DoTopJN = 0) OR (X.Sequence = 1))
答案 6 :(得分:0)
我不认为这是可能的,因为TOP
不仅应用于列,而且应用于整行。您必须创建两个不同的select语句并将它们放在IF ELSE
构造中。
答案 7 :(得分:0)
要更正SPE109的代码,请执行以下操作:
DECLARE @SomeNumber INT = 0
DECLARE @SQL nvarchar(max), @Params nvarchar(max)
set @Params = N''
SELECT @SQL = N'SELECT ' + CASE WHEN @SomeNumber = 0 THEN '' ELSE 'TOP ' + CAST(@SomeNumber as varchar) END + ' COLUMNNAME FROM TABLE'
exec sp_executesql @SQL, @Params