return仅返回整数状态码,必须用exec @var = proc显式捕获;select才返回可渲染的结果集,二者功能分离、不可互替。

不是存储过程没查出数据,而是你把 RETURN 值误当成结果集了——它和 SELECT 完全不兼容,也不能被前端或报表工具直接渲染。
RETURN 0 是状态码,不是数据行
SQL Server 的 RETURN 只能返回一个 INT 状态值(比如成功返回 0,失败返回非 0),它不会产生结果集,也不会出现在查询网格里。你在 SSMS 里写 EXEC proc_name 看不到任何表格,只看到“命令已成功完成”,这就是典型表现。
-
RETURN的值必须用EXEC @val = proc_name捕获,再单独SELECT @val才能看到 - Java/JDBC 中要用
CallableStatement.execute()后调getUpdateCount()获取,不能指望getResultSet() - MyBatis、Power BI、FineReport 这类工具根本不读
RETURN,它们只认SELECT输出的结果集
想返回一行 0,必须用 SELECT
要让调用方拿到带字段名的单行数据(比如 total_count 列值为 0),唯一办法是在存储过程里写 SELECT。常见错误是只靠 RETURN 或 OUTPUT 参数就想“返回数据”。
- 正确写法:
SELECT COALESCE(SUM(qty), 0) AS total_count FROM orders WHERE dt = @dt - 如果
SUM()无匹配行,会返回NULL,COALESCE把它转成 0;不加这个,结果集就为空 - 别用
IF NOT EXISTS(...) SELECT 0,这种分支容易漏掉SET NOCOUNT ON,导致客户端收不到结果 - MySQL 不支持
RETURN在存储过程中返回标量值,硬写会报错,只能用OUT参数 + 额外SELECT
客户端只取第一个结果集,后续被静默丢弃
如果你的存储过程里先写了 INSERT,再写 SELECT,又没加 SET NOCOUNT ON,那 JDBC、Python cursor 或 MyBatis 默认只拿到“1 行受影响”消息,真正的 SELECT 结果被跳过。
- 必须在存储过程开头第一行加
SET NOCOUNT ON,位置错或晚于任何语句都无效 - .NET 中要用
SqlDataReader.NextResult()才能读第二个及以后的SELECT;Java 里对应的是getMoreResults() - Navicat/DBeaver 能看到多个结果,是因为它们主动拉取全部;但 PHP
mysql_query()或旧版 JDBC 驱动根本不支持多结果,直接忽略
最常被忽略的点:RETURN 和 SELECT 是两条平行通道,互不影响也互不替代。你要数据,就得走 SELECT;你要状态码,才用 RETURN。混着用不报错,但结果永远不对。











