3

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

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

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

千汤

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

4

4 回答 4

4

我在使用 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
于 2012-09-19T15:47:51.903 回答
3

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

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

于 2011-08-22T17:27:09.507 回答
2

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

于 2011-08-22T17:28:01.850 回答
2

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

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

于 2011-08-22T18:08:43.307 回答