`

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 开发系列,分15个课时介绍了我们在日常使用SQLServer过程中需要注意的问题和一些应用。

    如何查看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

    sqlserver2005存储过程例子

    -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; CREATE TABLE [dbo].[ReDealCheck]( [AppplyNo] [varchar](50) COLLATE Chinese_PRC_CI...

    SQL Server2000解密过程

    set nocount on --CSDN:j9988 copyright:2004.07.15 --V3.2 --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器 --修正上一版"视图触发器"不能正确解密错误 --发现有错,请E_MAIL:

    SQL实际应用面试题

    问:我怎样才能使用SQL Server对结果集的分页进行管理? 答:您经常需要使用一次一页的形式来显示一个结果集,并保证用户可以轻松查看各个结果集页面,特别是您在为Web站点开发程序的时候。虽然您可以使用ADO ...

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别.doc

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方式的用法。 先建立一个表,并添加一些数据来进行演示: 复制代码...

    SQLServer2008查询性能优化 2/2

    书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...

    sql server2005 分页存储过程

    SET @lbound = @ubound - (@pageSize + 1) -- return the last page of records if -- no records would be on the -- specified page END SET @STMT = 'SELECT ' + @fieldlist + ' FROM ( SELECT ROW_NUMBER...

    SQLServer2008查询性能优化 1/2

    书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...

    被遗忘的SQLServer比较运算符谓词

    官方的参考文档 ... 代码如下: set nocount on use tempdb go if (object_id (‘t1’ ) is not null ) drop table t1 create table t1 (n int ) insert into t1 selec

    浅析被遗忘的SQLServer比较运算符修饰词

    SQLServer中有三个关键字可以修改比较运算符:All、Any和Some,其中Some和Any等价。官方的参考文档... 代码如下:set nocount on use tempdb go if (object_id (‘t1’ ) is not null ) drop table

    经典SQL语句大全

    SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename -- 要操作的数据库名 SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 @MaxMinutes = 10, -- Limit ...

    SqlServer GO命令循环使用实例代码

    SET NOCOUNT ON; GO INSERT INTO dbo.T1 DEFAULT VALUES; GO 100 总结 以上所述是小编给大家介绍的SqlServer GO命令循环使用实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。...

    浅析SQL Server中包含事务的存储过程

    先来看一个概念: ... Set NOCOUNT ON; --不返回影响行数  Set XACT_ABORT ON; --使用存储过程执行事务需要开启XACT_ABORT参数(默认为OFF)  delete from table1 where name='' --删除数据sql1  begin tra

    sql经典语句一部分

    SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename -- 要操作的数据库名 SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 @MaxMinutes = 10, -- Limit ...

    数据库操作语句大全(sql)

    SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename -- 要操作的数据库名 SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 @MaxMinutes = 10, -- Limit...

    SqlServer 2005的排名函数使用小结

    先创建一个示例表: 代码如下: SET NOCOUNT ON USE [tempdb] IF OBJECT_ID(‘Sales’)IS NOT NULL DROP TABLE sales CREATE TABLE Sales ( empid VARCHAR(10) NOT NULL PRIMARY KEY, mgrid VARCHAR(10) NOT NULL, ...

    sqlserver 常用存储过程集锦

    =================分页========================== 代码如下: /*分页查找数据*/ CREATE PROCEDURE [dbo...AS set nocount on declare @p1 int declare @currentPage int set @currentPage = 0 declare @RowCount int se

    SQL Server 索引维护sql语句

    使用以下脚本查看数据库索引碎片的大小情况: 代码如下:DBCC SHOWCONTIG WITH FAST, TABLERESULTS, ALL_...— Declare variables SET NOCOUNT ON; DECLARE @tablename varchar(255); DECLARE @execstr varchar(400)

    SQL技术文摘

    使用联接来查询多个表 SET NOCOUNT { ON | OFF } 说明 用sp_lock诊断SQL Sever的性能问题 sql server临时表 如何保存数据库连接参数代码及步骤详解 用数据源访问数据库 GDI+ 在Delphi程序的...

Global site tag (gtag.js) - Google Analytics