我们最近在一个旧的生产存储过程中发现了这个问题(尽管这里还有很多其他的逻辑)。“为什么会有人从表格中选择前0行?”这是一种SQL骗局或技巧吗?
这是获取空集的一种方法;例如可以用它来创建一个与现有表具有相同列的新空表;
SELECT TOP 0 * INTO new_table FROM old_table
可以用作列名的来源,也可以用作返回列详细信息但不提供数据给客户端层的方式,还可以用作检查连接性的查询。
这与以下内容相同:
SELECT * FROM table WHERE 0=1
命名UNION ALL操作中的列
一定要阅读Alex K.的答案,他提出了许多我也曾使用过的理由。这只是最显而易见的一个。
这样做可以得到一个包含所有列的空结果集,而不是没有结果。 如果使用存储过程的程序期望某些列,则否则会崩溃。
SELECT TOP(0) column INTO #temp FROM [mytable]
生成一个和我的表具有相同排序规则的临时表。这意味着
SELECT * FROM #temp T INNER JOIN [mytable] M ON M.column=T.column
让我提供一个额外的用途:
如果你想要在输出中打印一条消息而不是在消息中,你可以使用
select top 0 0 '这里是你的消息'
而不是
print '这里是你的消息'
您可以使用此功能在不加载任何数据的情况下检查 SQL 语法是否正确。
我在创建临时表时,通常会从现有的数据库表中使用它 - 而不使用任何数据。但是以下方法比使用 top 更可靠。
SELECT * FROM <table_name> LIMIT 0;