如果查询仅返回1个结果,则执行查询并返回所选值的存储过程

时间:2013-12-11 13:52:56

标签: sql-server-2008 tsql stored-procedures

所以我的查询如下,可能会返回很多结果:

SELECT P_CODE, NAME FROM TEST.dbo.PEOPLE
WHERE NAME LIKE '%JA%'
AND P_CODE LIKE '%003%'
AND DOB LIKE '%1958%'
AND HKID = ''
AND (MOBILE LIKE '%28%' OR TEL LIKE '%28%')

我想将它集成到存储过程(或视图?)中,以便只有在查询结果恰好为1行时才会返回结果。如果有0或> 1,那么它应该没有返回结果。

2 个答案:

答案 0 :(得分:2)

如果您只想在1:

以外的情况下返回空结果集
;WITH x AS
(
  SELECT P_CODE, NAME, c = COUNT(*) OVER()
  FROM TEST.dbo.PEOPLE
  WHERE NAME LIKE '%JA%'
  AND P_CODE LIKE '%003%'
  AND DOB LIKE '%1958%'
  AND HKID = ''
  AND (MOBILE LIKE '%28%' OR TEL LIKE '%28%')
)
SELECT P_CODE, NAME FROM x WHERE c = 1;

否则,您必须运行两次查询(或将结果转储到中间存储,例如#temp表) - 一次获取计数,一次根据计数决定是否运行{ {1}}或不。{/ p>

答案 1 :(得分:1)

实际上,你需要类似于Linq-to-SQL实现的FirstOrDefault(),但是在服务器端完成,这意味着你需要在存储过程中执行查询,将结果转储到{{3}然后访问temp table variable以获取返回的行数,然后决定是否将结果转发给调用者。 如果这样做,请确保在临时表的查询中使用TOP 1,这样您只能根据需要获得单个结果。

<强>更新

  • 我描述了Aaron在答案中描述的替代解决方案(我更喜欢)。
  • 在解决方案规范中删除了不必要的TOP说明符。