`

SQLServer SET NOCOUNT ON与JDBC:The statement did not return a result

 
阅读更多

在使用JDBC调用SQLServer执行Store Procedure时,遇到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:783)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:676)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(SQLServerStatement.java:611)
    at weblogic.jdbc.wrapper.Statement.executeQuery(Statement.java:480)

 

分析原因:是因为执行过程时,SQLServer 会返回数据影响行数(如select into #temp),如下图。影响行数会先于结果集返回,从而导致JDBC无法获取结果集,抛出异常。


 解决方法:在存储过程首行加上 SET NOCOUNT ON 

 

SET NOCOUNT { ON | OFF } 的使用:

使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息
语法:SET NOCOUNT { ON | OFF }
默认情况下为 OFF

 

当 SET NOCOUNT 为 ON 时,不返回计数(表示受Transact-SQL 语句影响的行数)。
当 SET NOCOUNT 为 OFF 时,返回计数。

 

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

 

当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft® SQL Server™ 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示"nn rows affected"。

 

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

 

SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。

 

注释当SET NOCOUNT 为ON 时,不返回计数(表示受Transact-SQL 语句影响的行数)。当SET NOCOUNT 为OFF 时,返回计数。 ... 结论:我们应该在存储过程的头部加上SET NOCOUNT ON 这样的话,在退出存储过程的时候加上SET NOCOUNT OFF这样的话,以达到优化 ...

 

 

  • 大小: 11 KB
分享到:
评论

相关推荐

    SQL SERVER 2008 开发系列

    ### SQL Server 2008 开发系列知识点详解 #### 一、索引新特点 在SQL Server 2008中,索引有了新的改进和特性,这其中包括了筛选索引的应用。筛选索引是一种特殊的非聚集索引,允许在创建索引时指定一个过滤条件,...

    Oracle和SqlServer语法区别

    SET NOCOUNT ON; UPDATE inserted SET employee_id = NEXT VALUE FOR employee_seq; END; ``` 可以看到,Oracle的PL/SQL触发器和SqlServer的Transact-SQL触发器语法有所不同。 四、迁移策略 了解了Oracle和Sql...

    sqlserver的存储过程与 where in 多值参数

    在SQL Server中,存储过程是预编译的SQL语句集合,它们封装了特定的数据库操作,提高了代码的重用性和执行效率。当涉及到处理多个值时,我们常常会遇到如何将这些值作为参数传递给存储过程的问题。本文将探讨在SQL ...

    优化SQL Server的内存占用之执行缓存

    SQL Server 执行缓存优化之内存占用 SQL Server 的内存占用是一个常见的问题,许多开发者和dba 都会遇到这种问题。解决这个问题的关键是理解 SQL Server 的内存占用结构和执行缓存的优化方法。在这篇文章中,我们将...

    最简单的SQL Server数据库存储过程分页

    ### 最简单的SQL Server数据库存储过程分页 #### 知识点概述 在处理大量数据时,分页查询是一项常见的需求。传统的T-SQL分页方法可能会导致性能问题,尤其是在面对百万级别的数据集时。本文介绍一种简单且高效的...

    如何进行SQL Server批量修改权限2

    SET NOCOUNT ON IF USER_ID(@old) IS NULL BEGIN RAISERROR ('The @old passed does not exist in the database', 16, 1) RETURN END IF USER_ID(@new) IS NULL BEGIN RAISERROR ('The @new passed does ...

    SqlServer触发器调用WebService

    SET NOCOUNT ON; DECLARE @ServiceUrl AS VARCHAR(1000); DECLARE @UrlAddress VARCHAR(500); DECLARE @Result VARCHAR(1000); DECLARE @Object INT; DECLARE @ResponseText VARCHAR(8000); -- WebService...

    JSP调用SQL Server的存储过程

    SET NOCOUNT ON; IF EXISTS (select UserID from BookUser Where UserName = @UserName) RETURN 0; ELSE BEGIN INSERT INTO BookUser(UserName, Title, Guid, BirthDate, Description, Photo, Other) VALUES ...

    SQL Server数据库中处理空值时常见问题

    SQL Server 数据库中处理空值时常见问题 数据完整性是任何数据库系统要保证的重点。不管系统计划得有多好,空数据值的问题总是存在。本文探讨了在 SQL Server 中处理这些值时涉及的 3 个问题:计数、使用空表值以及...

    SQL Server实用经验与技巧

    - **自定义日志大小**:通过T-SQL脚本动态调整日志文件大小,例如SET NOCOUNT ON,然后使用DECLARE语句设置逻辑文件名、最大时间限制和新的日志文件大小。 了解并掌握这些SQL Server实用技巧,可以帮助你更有效地...

    SQL SERVER数据库脚本开发规范

    * SET NOCOUNT ON 语句:使用 SET NOCOUNT ON 语句来提高查询性能。 * 模糊查询 Like 语句:使用模糊查询 Like 语句来提高查询性能。 * 不要在 Where 子句关联字段上使用函数:避免在 Where 子句关联字段上使用函数...

    千万级数据分页查询存储过程SQLServer

    SET NOCOUNT ON; SELECT * FROM YourTable ORDER BY SomeColumn OFFSET (@pageNumber - 1) * @pageSize ROWS FETCH NEXT @pageSize ROWS ONLY; END ``` 存储过程的优点在于,它可以封装复杂的逻辑,使得...

    SQL Server语句大全

    - 如何使用`SET ANSI_NULLS OFF`、`SET NOCOUNT ON`等语句来优化查询性能。 - 如何使用`SET LANGUAGE 'SimplifiedChinese'`设置查询结果的语言环境。 - 如何使用游标来逐行处理查询结果。 综上所述,本文提供的SQL...

    SQL Server 2005分页显示存储过程

    ### SQL Server 2005 分页显示存储过程 #### 背景介绍 在数据库应用开发中,分页查询是非常常见的需求之一。对于大型数据集来说,如果一次性加载所有数据到前端展示,不仅会增加服务器负担,还会影响用户体验。因此...

    sqlserver常用的存储过程

    SET NOCOUNT ON; DECLARE @p1 INT; DECLARE @CurrentPage INT; SET @CurrentPage = 0; DECLARE @RowCount INT; SET @RowCount = 0; DECLARE @PageCount INT; SET @PageCount = 0; EXEC sp_cursoropen @...

    如何查看SQLServer数据库每个表占用的空间大小

    CREATE PROCEDURE [dbo] [sys viewTableSpace] AS BEGIN SET NOCOUNT ON; CREATE TABLE [dbo] #tableinfo 表名 [varchar] 50 COLLATE Chinese PRC CI AS NULL 记录数 [int] NULL

    SQL SERVER 表数据导出脚本

    根据提供的文件信息,我们可以深入分析并提取出与“SQL Server 表数据导出脚本”相关的几个关键知识点。 ### 知识点一:SQL Server 存储过程的创建与删除 在给定的部分内容中,首先出现的是一个存储过程的创建逻辑...

    海量数据分页sql server经典

    ### 海量数据分页在SQL Server中的实现与优化 #### 概述 在Web应用程序开发中,分页浏览是一项非常重要的功能。特别是在处理大量数据时,如何高效地实现分页变得尤为关键。传统的ADO记录集分页法因其内存占用高、...

    SQLServer 常用存储过程

    SET NOCOUNT ON; DECLARE @p1 int; DECLARE @currentPage int; SET @currentPage = 0; DECLARE @RowCount int; SET @RowCount = 0; DECLARE @PageCount int; SET @PageCount = 0; EXEC sp_cursoropen @p1 OUTPUT...

    SQLServer 2008 数据库定时自动备份

    SET NOCOUNT ON; DECLARE @sqlCommand NVARCHAR(1000) DECLARE @dateTime NVARCHAR(20) SELECT @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(), 111), '/', '') + REPLACE(CONVERT(VARCHAR, GETDATE(), 108), ...

Global site tag (gtag.js) - Google Analytics