简单检查SELECT查询空结果

Den*_* S. 59 sql database sql-server

任何人都可以指出如何检查选择查询是否返回非空结果集?

例如,我有下一个查询:

SELECT * FROM service s WHERE s.service_id = ?;
Run Code Online (Sandbox Code Playgroud)

我应该做下一件事:

ISNULL(SELECT * FROM service s WHERE s.service_id = ?)
Run Code Online (Sandbox Code Playgroud)

测试结果集是否为空?

Ed *_*d B 97

IF EXISTS(SELECT * FROM service s WHERE s.service_id = ?)
 BEGIN
   --DO STUFF HERE

 END
Run Code Online (Sandbox Code Playgroud)

  • @Ed B:没关系因为EXISTS在第一次成功的比赛中返回true.使用`EXISTS(SELECT 1/0 FROM SERVICE ...`进行测试 - 它应该返回一个不能除以零,但它不会 (17认同)
  • 将'SELECT*'更改为'SELECT TOP 1*'以提高效率 (4认同)
  • @OMG Ponies,@KM - 我告诉我的开发人员使用 Select 1 的唯一原因是简化搜索以压缩 Select * 的使用。此外,我在 SQL Server 以外的数据库中遇到了效率问题(咳嗽 Access 咳嗽),因为某些愚蠢的原因它对 Select 子句做了一些事情。 (2认同)

mar*_*c_s 78

使用@@ ROWCOUNT:

SELECT * FROM service s WHERE s.service_id = ?;

IF @@ROWCOUNT > 0 
   -- do stuff here.....
Run Code Online (Sandbox Code Playgroud)

根据SQL Server联机丛书:

返回最后一个语句影响的行数.如果行数超过20亿,请使用ROWCOUNT_BIG.

  • 这很安静,我喜欢它.这就是我在寻找的东西.谢谢. (7认同)
  • @MatrixManAtYrService:是的 - 这个问题 **IS** 关于使用 T-SQL 的 SQL Server .... (2认同)

Raj*_*aja 9

我同意Ed B.您应该使用EXISTS方法,但更有效的方法是:

IF EXISTS(SELECT 1 FROM service s WHERE s.service_id = ?)
BEGIN
   --DO STUFF HERE

END
Run Code Online (Sandbox Code Playgroud)

HTH

  • 如果您同意,您应该投票支持该答案.而不是重新发布相同的内容...... (13认同)
  • 我使用`SET SHOWPLAN_ALL ON`为`IF EXISTS(SELECT*FROM ...`和`IF EXISTS(SELECT 1 FROM ...)获得相同的查询计划 (5认同)

Sam*_*ain 8

你可以通过多种方式实现这一目标.

IF EXISTS(select * from ....)
begin
 -- select * from .... 
end
else
 -- do something 
Run Code Online (Sandbox Code Playgroud)

或者你可以使用IF NOT EXISTS , @@ROW_COUNT喜欢

select * from ....
IF(@@ROW_COUNT>0)
begin
-- do something
end
Run Code Online (Sandbox Code Playgroud)


KM.*_*KM. 6

尝试:

SELECT * FROM service s WHERE s.service_id = ?;

IF @@ROWCOUNT=0
BEGIN
    PRINT 'no rows!'
END
Run Code Online (Sandbox Code Playgroud)