我的存储过程中有以下代码,它在HTML页面上的用户输入时执行。
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我想要检查,如果在当前表中存在一个条目,如果不存在,它应该在档案中检查并返回。但是,当调用该过程时,它会返回两个表,因此如果当前表中没有数据,用户将得到一个错误,因为两个表都会返回,但我只希望它返回一个。我到底做错了什么?
发布于 2018-11-09 12:06:29
你对@@ROWCOUNT用法的理解是错误的,是的
但它并不妨碍以前查询的执行。
如果您想使用@@ROWCOUNT,那么前面的语句不应该有一个输出结果(例如,它可以是update,insert),您的查询可以如下所示
--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发布于 2018-11-09 12:06:09
如果@@ROWCOUNT是0,则存储过程将返回两个结果集--第一个结果集为空,第二个结果集可能有行。
无论是从table2还是table2_archive中选择查询,都需要重写查询以生成单个结果集。
在table2和table2_archive中没有重复行的情况下,一种方法是使用公共表表达式和union all,如下所示:
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如果有重复的行,则可以应用稍微麻烦的解决方案:
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
)https://stackoverflow.com/questions/53224824
复制相似问题