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

时间:2011-06-17 13:38:33

标签: sql sql-server

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

喜欢

Select * from Table_Name

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

11 个答案:

答案 0 :(得分:57)

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

在SSMS中

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

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

答案 1 :(得分:33)

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

您可以使用SET FMTONLY

来抑制行而不是结果集
SET FMTONLY ON
SELECT * FROM sys.tables

SET FMTONLY OFF
SELECT * FROM sys.tables

虽然没有亲自使用它......

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

答案 2 :(得分:14)

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

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

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

答案 3 :(得分:8)

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

如果不返回 结果的数量,您将如何执行SQL查询?

在这种情况下,答案是SET NOCOUNT ON

答案 4 :(得分:7)

insert anothertable
Select * from Table_Name

执行select但不返回任何内容

set noexec on 
Select * from Table_Name

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

答案 5 :(得分:4)

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

答案 6 :(得分:3)

就我而言,我正在测试数据在所有视图中的行为,例如:任何cast()函数都没有导致转换错误等。所以压制实际数据不是一个选项,显示不是太糟糕但是浪费了一点资源,如果仅在文本中发送结果,最好不要使用diplsay。 / p>

我想出了以下脚本来以这种方式测试所有视图,唯一的问题是当它遇到具有text / ntext列的视图时。

declare csr cursor local for select name from sys.views order by name
declare @viewname sysname
declare @sql nvarchar(max)

open csr
fetch next from csr into @viewname
while @@fetch_status = 0 begin
    --set @sql = 'select top 1 * from ' + @viewname 

    set @sql = 'declare @test nvarchar(max) select @test = checksum(*) from ' + @viewname 

    print @viewname

    exec sp_executesql @sql
    fetch next from csr into @viewname
end
close csr
deallocate csr

答案 7 :(得分:2)

目标是抑制所有行吗?然后使用对每行计算结果为false的过滤器:

SELECT * FROM Table_Name WHERE 1 = 2

答案 8 :(得分:0)

另一个用例是当你只想读取表的所有行时,例如测试是否存在损坏。在这种情况下,您不需要数据本身,只需要它是否可读。 但是,选项名称"在执行后丢弃结果"有点令人困惑 - 它告诉我结果被取出然后才被丢弃。相反,它肯定会获取数据,但不会将其存储在任何位置(默认情况下,行被放入网格中,或者您选择的任何输出) - 接收到的行会被动态丢弃(而不是AFTER执行)。 / p>

答案 9 :(得分:0)

我很惊讶社区不能轻易找到一个用例。大型结果集会在客户端上占用内存,如果许多SSMS窗口处于活动状态,这可能会成为一个问题(我打开2-3个SSMS实例并不常见,每个实例都有50-70个活动窗口)。在某些情况下,就像在Cyril的例子中一样,SSMS可能会耗尽内存而无法处理大型结果集。例如,当我需要调试返回数亿行的存储过程时,我遇到了一个案例。在不丢弃结果的情况下,在我的开发机器上运行SSMS是不可能的。该过程适用于SSIS包,它用作加载数据仓库表的数据源。 SSMS中的调试涉及进行非功能性更改(因此结果集对我不感兴趣)并检查执行统计信息和实际查询执行计划。

答案 10 :(得分:-2)

我需要一个proc来返回指定用户在某个时间点之后更新的所有记录,只显示记录存在的结果。这是:

-- Written by David Zanke
-- Return all records modified by a specified user on or after a specified date. 


If mod date does not exist, return row anyhow

Set Nocount on 

Declare @UserName varchar(128) = 'zanked'
    , @UpdatedAfterDate Varchar( 30)  = '2016-10-08'
    , @TableName varchar( 128)
    , @ModUser varchar( 128)
    , @ModTime varchar( 128)
    , @sql varchar( 2000 )


-- In a perfect world, left join would be unecessary since every row that captures the last mod user would have last mod date.

-- Unfortunately, I do not work in a perfect world and rows w/ last mod user exist w/o last mod date

Declare UserRows Cursor for Select distinct c1.table_name, c1.column_name, c2.column_name  From INFORMATION_SCHEMA.COLUMNS c1

Left Join INFORMATION_SCHEMA.COLUMNS c2 On c1.Table_Name = c2.Table_Name And c2.Column_name like '%DTTM_RCD_LAST_UPD%'
        Where c1.column_name like '%UPDATED_BY_USER%'


Open UserRows

Fetch UserRows Into  @tablename, @ModUser, @ModTime

While ( @@FETCH_STATUS = 0 )
Begin
    -- capture output from query into a temp table

    Select @sql = 'Select ''' + @TableName + ''' TableName, * Into ##HoldResults From ' + @TableName + ' Where ' + @ModUser + ' = ''' + @userName + ''''
            + Case When @ModTime Is Null Then '' Else   ' And ' + @ModTime + ' >= ''' + @UpdatedAfterDate + '''' End

    Exec ( @sql)

    -- only output where rows exist
    If @@ROWCOUNT > 0
    Begin
        Select * from ##HoldResults
    End
    Drop Table ##HoldResults

    Fetch UserRows Into  @tablename, @ModUser, @ModTime

End
Close UserRows;
Deallocate UserRows