仅当选择查询不为空时才返回结果

时间:2011-08-22 17:21:41

标签: sql sql-server select select-query

使用Sql Server。编写存储过程。这是我想要实现的伪代码:

    IF EXISTS ( SELECT  field1
                FROM    t1
                WHERE   field1 = ... AND field2 = ...) 
        BEGIN
            SELECT  field1
                FROM    t1
                WHERE   field1 = ... AND field2 = ...
        END

更好的方法吗?任何帮助表示赞赏。

chirayu已

更新:问题是同一个查询执行了两次。我不能只运行一次查询并返回null(如果结果为null我想返回一个替代结果)。

4 个答案:

答案 0 :(得分:3)

您可以在运行一次查询后检查@@ ROWCOUNT以确定是否返回值:

http://msdn.microsoft.com/en-us/library/ms187316.aspx

答案 1 :(得分:2)

如果选择不产生任何结果,则不会返回任何结果。我没有看到任何理由在这里使用条件,除非我遗漏了某些东西......

答案 2 :(得分:2)

有时会返回结果的存储过程,而有时它不会是任何API使用的噩梦。客户端API具有不同的入口点,具体取决于您是返回结果集(SqlCommand.ExecuteReader)还是不返回结果集(SqlCommand.ExecuteNonQuery)。应用程序不可能提前知道使用哪个API 建模工具使用SET FMTONLY选项分析返回结果集的元数据,当返回的结果集随机开始改变形状时,建模工具非常混淆。换句话说,你走错了路,停下来转身。

只需运行查询,没有符合条件的行,它只会返回一个空结果集。这正是每个客户端API和建模工具对您的过程所期望的。

答案 3 :(得分:2)

我在使用CTE和表变量之前已经这样做了,它需要更多行代码,但查询只写一次,因此你的逻辑存在于一个地方。

DECLARE @Results TABLE (Result INT);
WITH ResultsCTE AS
(
    --Your query goes here 
    SELECT  1 as Result 
    WHERE 1 = 1
)
INSERT INTO @Results
SELECT Result
FROM ResultsCTE

IF (SELECT COUNT(*) FROM @Results) > 0
BEGIN
    SELECT * FROM @Results
END
ELSE BEGIN
    SELECT 'Do Something Else or Do Nothing!'
END