SQL Server:选择 Top 0 是什么意思?

39
我们最近在一个旧的生产存储过程中发现了这个问题(尽管这里还有很多其他的逻辑)。“为什么会有人从表格中选择前0行?”这是一种SQL骗局或技巧吗?

9
获取列名/表头? - Joe
它绝对会这样做。 - Dave Ziegler
8个回答

58

这是获取空集的一种方法;例如可以用它来创建一个与现有表具有相同列的新空表;

SELECT TOP 0 * INTO new_table FROM old_table

可以用作列名的来源,也可以用作返回列详细信息但不提供数据给客户端层的方式,还可以用作检查连接性的查询。

这与以下内容相同:

SELECT * FROM table WHERE 0=1

30

命名UNION ALL操作中的列

一定要阅读Alex K.的答案,他提出了许多我也曾使用过的理由。这只是最显而易见的一个。


我认为这很可能是原因,只想确认没有其他事情发生。谢谢。 - Dave Ziegler
我接受这个答案,我相信在我们的情况下这就是原因。谢谢! - Dave Ziegler
我只在罕见的情况下使用它,比如在处理SSAS或其他疯狂的情况下。 - richard

3

这样做可以得到一个包含所有列的空结果集,而不是没有结果。 如果使用存储过程的程序期望某些列,则否则会崩溃。


2
你可以使用这个来获取列名。

只是检查是否有匹配。-- 请说明? - Dave Ziegler
没事了,忽略那个。 :) 我想错了。已经有一段时间没有使用SQL Server了,所以有点混淆了。你指出了我的错误,抱歉! - dtbarne
没问题,我不是在指责你...我以为你知道我不知道的事情。这就是为什么我发了这个问题!;) - Dave Ziegler
没有关系,我并不是有负面意思。 - dtbarne

1
使用此功能创建临时表,以便您的数据库和TEMPDB的排序规则可能不同。
SELECT TOP(0) column INTO #temp FROM [mytable]

生成一个和我的表具有相同排序规则的临时表。这意味着

SELECT * FROM #temp T INNER JOIN [mytable] M ON M.column=T.column

不会因排序错误而失败。

0

让我提供一个额外的用途:

如果你想要在输出中打印一条消息而不是在消息中,你可以使用

select top 0 0 '这里是你的消息'

而不是

print '这里是你的消息'


0

您可以使用此功能在不加载任何数据的情况下检查 SQL 语法是否正确。


-1

我在创建临时表时,通常会从现有的数据库表中使用它 - 而不使用任何数据。但是以下方法比使用 top 更可靠。

SELECT * FROM <table_name> LIMIT 0;

1
这不是有效的TSQL... - Atario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接