使用GROOVY SQL从SQL SERVER存储过程获取结果集

问题描述

|| 我正在尝试从我的GRAILS应用程序中的SQL SERVER(我相信是2005)中的存储过程中获取结果集。 (Grails 1.3.2,Groovy 1.7.6) 该存储过程可以在任何查询浏览器上正常运行,我使用SQLDBX,它始终返回期望的结果集。 但是,从我的应用程序内部,如果该过程实际上修改了数据,它将抛出一个错误,但如果不是,则不会抛出该错误,并且将返回我想要的结果集。 现在,我无法在此处发布该过程,但这是修改后的版本。几乎做同样的事情。
CREATE PROCEDURE [procedure1]
@year VARCHAR(4)
as
begin
DECLARE @var1 INT
DECLARE @var2 varchar(50)
DECLARE @counter INT

SET @counter=0

set @cursor = CURSOR FAST_FORWARD for
        select *
        FROM [table1] as t1
        INNER JOIN [table2] as t2
        ON t1.f_id = t2.f_id
        WHERE t1.year = @year
open @cursor
set @date = GETDATE()

fetch next from @cursor into @var1,@var2
while @@FETCH_STATUS = 0
begin
    select @numRows = count(id) from table1
    if(@numRows = 0)
    begin
        SET @counter=@counter+1
    END

    fetch next from @cursor into @var1,@var2
end

close @cursor
deallocate @cursor
SELECT @counter AS \'count\'
return 0
END
GO
修改后的版本意义不大,但执行相同的操作。 从我的GRAILS应用程序中,我正在执行以下操作:
Sql conn = new Sql(dataSource) //A valid declaration  
try{  
  def results = conn.rows(\"execute [dbo].[procedure1] @year=\'2011\'\")  
  println(\"${results}\")  
}  
catch(SQLException e){  
  println(e.getMessage())  
}  
每次运行并修改计数器(也就是不为零)时,都会引发异常。但是如果我跑步 来自SQLDBX的“ 2”,并且计数器不为零,它返回了我期望的值。 我也尝试了Groovy SQL类中的几种不同方法,所有这些方法似乎都抛出了该异常,或者不是我想要的。 例外是
com.microsoft.sqlserver.jdbc.SQLServerException - The statement did not return a result set.
如果您需要更多信息,请告诉我。     

解决方法

在程序中的the5ѭ之后加上
SET NOCOUNT ON
。添加此内容将告诉sql server不要在sproc中返回修改后的记录数。 这是文件... http://msdn.microsoft.com/en-us/library/ms189837.aspx     ,executeQuery()用于与返回ResultSet的查询(通常为SELECT语句)一起使用。 executeUpdate()用于返回更新计数的INSERT,UPDATE,DELETE或DDL语句。 JDBC将以上两项(结果集和更新计数)都视为“结果”。对于返回多个结果的查询,它要求我们调用execute()。 如果存储过程使用临时表,则可能首先返回更新计数,然后返回ResultSet。您应该使用execute()运行查询,调用getMoreResults()跳过更新计数,然后调用getResultSet()获取所需的ResultSet。这里的问题是,我们必须通过多次调用getMoreResults()来进行反复试验,以通过调用getResultSet()来获取所需的结果集。 您可以通过指定\“ SET NOCOUNT ON \”来取消所有多余的\“ query results \”,而不是上述尝试和错误的方式。 需要更改, 将您的逻辑放在SP \“ SPCHILD \”中。该存储过程将具有逻辑以及临时表的创建。 如下创建一个SP \“ SPPARENT \”,
 CREATE PROCEDURE [dbo].[SPPARENT]    @Id int = NULL
 AS
 BEGIN
 SET NOCOUNT ON;
 EXEC(\' SPCHILD @Id = \' + @Id)
 END
在父级SP \“ SPPARENT \\”中,您必须调用实际的SP,即\“ SPCHILD \”。 从您的JDBC代码对\“ SPPARENT \”进行SP调用。     ,请参阅我的答复,以获取可以以类似于“ 7”的方式处理存储过程ResultSet的实用程序     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...