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

Java 使用GROOVY SQL从SQL SERVER存储过程获取结果集,java,sql,stored-procedures,grails,groovy,Java,Sql,Stored Procedures,Grails,Groovy,我试图从SQLServer2005中的一个存储过程中获取一个结果集,我相信这是在我的GRAILS应用程序中实现的。Grails1.3.2,Groovy1.7.6 存储过程在任何查询浏览器中都可以正常运行,我使用SQLDBX,它会像我一直期望的那样返回结果集 但是,在我的应用程序中,如果过程实际修改了数据,它将抛出一个错误,但如果没有,它将不会抛出此错误,并将返回我想要的结果集 现在我不能在这里发布程序,但这是一个修改版本。这几乎是一样的 CREATE PROCEDURE [procedure1]

我试图从SQLServer2005中的一个存储过程中获取一个结果集,我相信这是在我的GRAILS应用程序中实现的。Grails1.3.2,Groovy1.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执行procedure1@year='2011',计数器不是零,它返回我所期望的结果

我也尝试了GroovySQL类中的一些不同方法,它们似乎都抛出了这个异常,或者不是我想要的

例外是

com.microsoft.sqlserver.jdbc.SQLServerException - The statement did not return a result set.
如果您需要更多信息,请告诉我。

在存储过程中的AS之后添加SET NOCOUNT ON。添加此项将告诉sql server不要返回存储过程中已修改记录的数量

这是文件


executeQuery用于返回ResultSet的查询,通常是SELECT语句

executeUpdate用于返回更新计数的INSERT、UPDATE、DELETE或DDL语句

JDBC将上述结果集和更新计数都视为结果。对于返回多个结果的查询,需要调用execute

若存储过程使用临时表,则可能首先返回更新计数,然后返回结果集。您应该使用execute运行查询,调用getMoreResults跳过更新计数,然后调用getResultSet获取所需的结果集。这里的问题是,我们必须通过多次调用getMoreResults来进行反复试验,以通过调用getResultSet获取所需的结果集

您可以通过指定SETNOCOUNT ON来抑制所有额外的查询结果,而不是上述的反复试验

所需的更改

将逻辑放入SP SPCHILD中。此存储过程将具有创建临时表的逻辑

创建一个SP SPPARENT,如下所示

 CREATE PROCEDURE [dbo].[SPPARENT]    @Id int = NULL
 AS
 BEGIN
 SET NOCOUNT ON;
 EXEC(' SPCHILD @Id = ' + @Id)
 END
从父SP家长处,您不必调用实际SP,即SPCHILD

从JDBC代码对SPPARENT进行SP调用


请参阅我的答案,了解一个util,它可以以与groovy.sql.sql类似的方式处理存储过程结果集

是否可能返回多个结果集,每个结果集对应于过程中运行的每个选择?我会尝试将表1中的select@numRows=countid替换为表1中的set@numRows=select countid。这没有效果,仍然给出了语句未返回结果集错误的提示。它仍然完成了这个过程。我有一个变通方法,基本上是在存储过程之前查询受影响的表,然后在存储过程之后查询,并计算计数的差值。我真的很想让结果集工作,因为当这个表变得更大时,这两个额外的查询将花费宝贵的时间。谢谢。作为更新,我想我忘了提到我正在IBMWebSphere中运行。GRAILS应用程序使用JNDI源代码,而主SQL Server数据库的JNDI源代码使用的是过时的JDBC驱动程序。我不能在本地运行它,因为有一些外部配置的东西,或者更新WAS上的驱动程序,所以我不能测试它是驱动程序还是GROOVY。不幸的是,我被工作缠住了。