首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果@@ROWCOUNT是0存储过程

如果@@ROWCOUNT是0存储过程
EN

Stack Overflow用户
提问于 2018-11-09 11:24:22
回答 2查看 3.9K关注 0票数 1

我的存储过程中有以下代码,它在HTML页面上的用户输入时执行。

代码语言:javascript
复制
SELECT  a.code, a.name
FROM    table2 b
        INNER JOIN table1 a ON a.id = b.id
WHERE   b.data = @parameter
        AND b.condition = 1
        IF @@ROWCOUNT = 0

    SELECT  a.code, a.name
    FROM    table2_archive b
            INNER JOIN table1 a ON a.id = b.id
    WHERE   b.data = @parameter
            AND b.condition = 1

我想要检查,如果在当前表中存在一个条目,如果不存在,它应该在档案中检查并返回。但是,当调用该过程时,它会返回两个表,因此如果当前表中没有数据,用户将得到一个错误,因为两个表都会返回,但我只希望它返回一个。我到底做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-09 12:06:29

你对@@ROWCOUNT用法的理解是错误的,是的

返回受最后一条语句影响的行数。

但它并不妨碍以前查询的执行。

如果您想使用@@ROWCOUNT,那么前面的语句不应该有一个输出结果(例如,它可以是updateinsert),您的查询可以如下所示

代码语言:javascript
复制
--varchar(100) -- because you don't specified the data types

DECLARE @parameter AS VARCHAR(100) = 'xxxx'

DECLARE @tbl1 AS TABLE (code VARCHAR(100), name VARCHAR(100))

INSERT INTO @tbl1 (code, name) -- last statement
SELECT  a.code, a.name
FROM    table2 b
        INNER JOIN table1 a ON a.id = b.id
WHERE   b.data = @parameter
        AND b.condition = 1

-----------------------------------
IF @@ROWCOUNT = 0 -- check if last statement are not produced the rows
--also `IF NOT EXISTS (SELECT * FROM @tbl1)` can be used here, to check if @tbl1 contains a records
    BEGIN
         SELECT  a.code, a.name
         FROM    table2_archive b
                 INNER JOIN table1 a ON a.id = b.id
         WHERE   b.data = @parameter
                 AND b.condition = 1        
    END
ELSE
    SELECT * FROM @tbl1
票数 3
EN

Stack Overflow用户

发布于 2018-11-09 12:06:09

如果@@ROWCOUNT0,则存储过程将返回两个结果集--第一个结果集为空,第二个结果集可能有行。

无论是从table2还是table2_archive中选择查询,都需要重写查询以生成单个结果集。

table2table2_archive中没有重复行的情况下,一种方法是使用公共表表达式和union all,如下所示:

代码语言:javascript
复制
WITH CTE AS
(
    SELECT  data, id
    FROM    table2 
    UNION ALL 
    SELECT  data, id
    FROM    table2_archive 
)

SELECT  a.code, a.name
FROM    cte b
        INNER JOIN table1 a ON a.id = b.id
WHERE   b.data = @parameter
        AND b.condition = 1

如果有重复的行,则可以应用稍微麻烦的解决方案:

代码语言:javascript
复制
WITH CTE AS
(
    SELECT  a.code, a.name
    FROM    table2 b
            INNER JOIN table1 a ON a.id = b.id
    WHERE   b.data = @parameter
            AND b.condition = 1
)

SELECT code, name
FROM CTE
UNION ALL

SELECT  a.code, a.name
FROM    table2_archive b
        INNER JOIN table1 a ON a.id = b.id
WHERE   b.data = @parameter
        AND b.condition = 1
        AND NOT EXISTS (
            SELECT 1 
            FROM CTE
        )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53224824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档