我在SQL Server 2012中有一个存储过程,它有一些参数,包括表类型参数,因为SQL server 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代码来执行这个存储过程,我能够建立连接,但execute()方法总是返回false。 java代码如下
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中执行相同的存储过程时,它会返回正确的结果表。
答案 0 :(得分:3)
该过程返回受影响的1行的消息,这些消息在java中被视为存储过程输出,因此会减少原始结果。
简单的技巧是在存储过程的开头添加 SET NOCOUNT ON ,这样它就不会返回这样的消息,从而返回实际的输出。