如何在不显示结果的情况下执行SQL查询

Raj*_*mar 39 sql sql-server

是否可以在不显示结果的情况下执行SQL查询?

喜欢

Select * from Table_Name
Run Code Online (Sandbox Code Playgroud)

运行此查询后,结果不应该显示在sql server中.

der*_*oby 63

我很惊讶没有人想出答案:打开"执行后丢弃查询结果"选项 ; 我很确定那是面试官所追求的.SET FMT ONLY恕我直言,完全不同.

在SSMS中

  • 打开一个新查询
  • 在菜单中选择查询/查询选项
  • 选择"结果"窗格
  • 检查"执行后丢弃结果"

您可能希望这样做的原因是为了避免必须等待并浪费资源以将结果加载到网格中,但仍然能够具有例如实际执行计划.

  • 很好的答案.我需要这个看****查询运行多长时间没有SSMS浪费CPU周期来绘制网格,耗尽显示内存和其他b/s (16认同)
  • 这,正是这个.我需要连续运行1000个查询,每个查询返回一个结果集,同时记录执行时间.如果我显示了结果集,我会轻易地崩溃SSMS. (6认同)
  • 性能调优/基准测试脚本正是您想要这样做的原因 - 您正在跟踪执行时间并希望忽略将结果抽回的时间(您实际上无法控制),重点关注查询执行时间(您可以控制).这完全合法! (3认同)
  • 似乎也丢弃了消息,所以使用设置统计数据对我没有帮助 (2认同)

gbn*_*gbn 33

执行返回记录集.当然它可能没有行但得到结果

您可以使用SET FMTONLY抑制行但不抑制结果集

SET FMTONLY ON
SELECT * FROM sys.tables

SET FMTONLY OFF
SELECT * FROM sys.tables
Run Code Online (Sandbox Code Playgroud)

从来没有亲自使用它...

编辑2018.如上所述,请参阅@ deroby的答案,以寻求更好的解决方案

  • 另外值得一提的是set fmtonly实际上不会运行查询.它只获取元数据(因此名称).例如,运行基准测试不是很有用...... (4认同)
  • 值得一提的是,从SQL Server 2012开始,此功能已被弃用,而是替换为某些功能.请点击帖子中的链接获取更多信息 (2认同)
  • 看看@deroby对当前解决方案的回答. (2认同)

Phi*_*ley 14

对我来说听起来像是一个可疑的面试问题.我已经完成了,我需要这样做,但你只需要在相当模糊的情况下这样做.模糊不清,但有时非常重要.

正如@gbn所说,有一种编程方式SET FMTONLY(谢谢,现在我不必从我的旧脚本文件中挖掘它).一些程序和实用程序在查询SQL时执行此操作; 首先他们提交一个带有FMTONLY ON的查询,以确定生成的表结构的布局,然后当他们准备好运行它以FMTONLY OFF获取时,获取实际数据.(当程序调用第二个程序时,我发现了这一点,第二个程序返回了数据集,并且由于晦涩的原因,整个纸牌屋都掉了下来.)

这也可以在SSMS中完成.对于所有查询窗口,在"工具/选项"下,"查询结果/ SQL Server /结果到XX",选中"查询执行后丢弃结果"; 仅对于当前窗口,在"查询/查询选项"下,"结果/ XX",相同的复选框.这里的优点是查询将在数据库服务器上运行,但不会返回数据结果.如果您正在检查查询计划但不希望收到10GB的数据(通过网络连接到您的笔记本电脑上),或者您正在进行一些严重的循环测试,这可能是非常宝贵的,因为SSMS只能接受在使用"太多结果集"消息停止查询之前,来自给定"运行"的结果集如此之多.[嗯,请仔细检查我的"仅查询计划"位 - 我认为这样做,但已经很长时间了.

  • "放弃结果"似乎是正确执行此操作的唯一方法 - 所有其他选项实际上并不执行SQL:| (3认同)

Ant*_*ull 8

也许面试官打算提出一个不同的问题:

如何在不返回结果数的情况下执行SQL查询?

在那种情况下答案是SET NOCOUNT ON.


Ale*_* K. 7

insert anothertable
Select * from Table_Name
Run Code Online (Sandbox Code Playgroud)

执行select但不返回任何内容

set noexec on 
Select * from Table_Name
Run Code Online (Sandbox Code Playgroud)

解析但不执行,因此不返回任何内容.


小智 5

如果您需要执行查询但不需要实际结果集,您可以将查询包装在 EXISTS(或 NOT EXISTS)语句中:IF EXISTS(SELECT * FROM TABLE_NAME...)。或者,您可以选择 INTO #temp,然后删除临时表。