当前位置: 首页 > 知识库问答 >
问题:

SQL Server 2012存储过程不会在JDBC中返回任何结果

莘聪
2023-03-14

我有一个存储过程在SQL服务器2012其中有一些参数包括表类型参数以及SQL服务器2012不支持表类型参数我写了另一个存储过程通过设置默认值此表类型参数和只有varchar参数为新过程

DECLARE @pTempTable TABLE(

   region varchar(max),
   country varchar(max),
   username varchar(max),
   firstname varchar(max),
   lastname varchar(max),
   accessform varchar(max),
   accessmodule varchar(max),
   adate varchar(max),
   atime varchar(max)
 )

 BEGIN

  DECLARE @pTestFromDate DATETIME = '2008/01/01', @pTestToDate      DATETIME     = '2014/12/31'

   DECLARE @pCountryIds GuidsTableType
   INSERT @pCountryIds VALUES(NULL)

   DECLARE @pRegionIds GuidsTableType
   INSERT @pRegionIds VALUES(NULL)

   DECLARE @pUserId UNIQUEIDENTIFIER = NULL
   DECLARE @pModuleId UNIQUEIDENTIFIER = NULL

    insert into @pTempTable exec usp_rpt_UserAudit
   @RoleName = @pRoleName
  ,@pCountryIds=@pCountryIds
  ,@pRegionIds=@pRegionIds
  ,@pUserId=@pUserId
  ,@pModuleId=@pModuleId
  ,@pFromDate=@pTestFromDate
  ,@pToDate=@pTestToDate
  SELECT * from @pTempTable


END

GO

我已经编写了一个java代码来执行这个存储过程,我能够建立连接,但是执行()方法总是返回false

    String finalSql = "{ call usp_rpt_sprocexecution(?) } ";
    CallableStatement cs = connection.prepareCall(finalSql);
    cs.setString(1, "Super Administrator");
    System.out.println(cs.execute());
    int c=0;

    while(!((cs.getMoreResults() == false) && (cs.getUpdateCount() <= 1))){
        System.out.println(c++);
        ResultSet rs = cs.getResultSet();
        System.out.println(rs.getString(1));
    }

当我在Management Studio中执行相同的存储过程时,它会返回正确的结果表。

共有1个答案

谢典
2023-03-14

该过程返回消息,如受影响的1行,在java中被视为存储过程输出,因此会降低原始结果。

简单的技巧是在存储过程的开始添加SET NOCOUNT ON,这样它就不会返回这样的消息,从而返回实际的输出。

 类似资料:
  • 问题内容: 我正在调用一个Sybase存储过程,该存储过程通过JDBC返回多个结果集。我需要获取一个具有名为“ Result”的列的特定结果集,这是我的代码: 这里发生的是返回很多空结果集,直到达到目标结果集为止。我不能用作循环条件,因为它对空结果集返回false。 我放置了一个固定数字以结束循环,条件是没有返回所需的结果集,以防止其进入无限循环。它工作正常,但我认为这是不对的。 我认为从Syba

  • 问题内容: 我正在写一个基本查询,类似: 我想然后通过使用类似的结果执行: 我的问题是,如何检查? 问题答案: 如果您希望查询可能经常返回行(尤其是很多行),也可以这样做,这可能会提供一个更好的短路机会: …因为它将在到达匹配的第一行后立即返回。 我不建议仅使用它,因为您每次都必须实现(忽略)整个结果集。

  • 问题内容: 我需要一个SP来返回多组结果。第二组结果将基于第一组结果的一列。 所以: 如何用我的SP返回@ myTable1和@ myTable2?这种语法完全正确吗? 抱歉,我仍然是SQL的新手… 编辑: 因此,我在下面的代码的最后一行看到错误:“必须声明标量变量“ @ myTable1”” 如果我突出显示并运行代码直到第二个代码,它就可以正常工作。 EDIT2: 解决了该问题。谢谢你们。 问题

  • 问题内容: 我有一个存储过程,它检查用户是否已经存在,无论用于电子邮件的输入是什么,它随数据库的第一行一起返回。如果我手动运行select语句,我将得到正确的结果。有什么建议吗? 问题答案: 您的问题无疑在这里: 白衣 您的参数名称与列名称相同。这 可 实际工作,但规则使它这样做可能是怪异。(我认为,如果您更改引号,它可能会起作用)。 但是实际上,您应该做的是将参数重命名为其他名称:

  • 我有一个存储过程,它接受参数并返回一个长值。 我如何使用jdbcTemplate来调用这个存储过程并获得返回的值。 这样对吗?

  • 问题内容: 我正在尝试从存储过程中获取返回值,但它始终返回0。 C#代码 SP 在所有情况下,它都返回0。我不知道问题所在。 问题答案: 我尝试了类似您的代码,并且可以按预期工作。 但是,您的代码中两次调用ExecuteNonQuery。 首次调用时,将按预期插入记录,然后为返回值添加参数并再次执行命令。但是现在记录已存在,并且存储过程始终落在else块中,因此始终返回零。