在SQL Server 2005中升级存储过程作者:Serdar Yegulalp  2007-05-29     《SQL Server 2005的变化》一文中揭示了SQL Server 2005的变化如何打破了旧有的应用程序和数据库,特别是使用被抛弃的函数的地方。现在我将要讨论的是如何在你的移植过的数据库里面使用存储过程来充分利用这个SQL Server2005中的新函数,而不需要打破现有的功能性。     我们假设你有一个前端的应用程序,是由不同的团队来分别写入或者管理,并且它不像后台数据库那样频繁更新。你想要在SQL Server应用程序的存储过程中进行修改以充分利用新的功能。你还想要这个过程尽量温和,这样数据库和前端应用程序就都不会突然崩溃。     例如,你想要更新存储过程来使用SQL Server 2005的T-SQL中一些新的功能,例如TRY and CATCH函数,这个函数可以让复杂的错误追踪变得简单一点。你通常会拷贝现有的存储过程到一个新的并行的存储过程里面去,然后对它进行更新,使用新的功能,然后或者在经过修改的前端应用程序版本,或者查询分析器中测试两方面的行为。     当你很自信新的存储过程的行为是正确的,并且它也准备好用在产品中,你就可以无缝的替换它,例如通过修改两个存储过程的名字,或者通过代码的拷贝。我个人倾向于修改名字,因为这可以让你对原有的代码做个备份——像你的数据库中的其它东西一样,做个备份,以防出现不可预期的问题。     这是相对标准的技术,但是我曾见过的更有意思的一个问题涉及了可选参数传递: CREATE PROCEDURE my_procedure
{其它的参数在这里},
@optionalparameter Boolean=FALSE
AS
If @optionalparameter=TRUE
Begin
{带有SQL Server 2005-特定命令的新版本的存储过程放在这里}
End
Else
Begin
{旧版本的存储过程放在这里}
End     还有另外一种有用的方式来选择性的测试代码。现有的前端对存储过程的呼叫不会使用可选参数,还会执行原来的代码。你可以在这里使用新的前端代码来测试存储过程,然后优雅地更新对现有存储过程的参考。因为参数是可选的,所有现有的对存储过程的呼叫(例如那些没有参数的呼叫)都会像以前一样准确地传递过去。     如果你不能添加新的存储过程,但是可以修改现有的存储过程的话,还有一种在这种限制下的好办法。当没有保留历史遗留代码的时候,你可以在存储过程中逐步淘汰IF。最后,在存储过程和你的前端代码中逐渐放弃可选参数。1

解决方案 »

  1.   

    刚才实验了一下,存储过程以表变量的方式返回结果集就会被提示“没有结果集返回”,虽然这个语句在查询分析器里面可以被正常执行,但是放在jboss容器中就不能被sql2005 jdbc驱动识别。
    目前还在找方法解决!
      

  2.   

    ADD:
    使用临时表返回结果集也是提示这个错误!
      

  3.   

    wzy_love_sly:
    在sql server 2000中是可以的,在2005中一样可以的啊,但是这个最新版的ms jdbc1.2竟然会这样提示。
      

  4.   

    看来应该是sql2000升级到 2005之后 存储过程返回结果集方式有问题。
      

  5.   

    补充:使用 DBUtils的QueryRunner.query() 时如果在存储过程中用临时表就会出错,直接用 JDBC 中的CallableStatement.executeQuery() 就没问题。
      

  6.   

    和驱动有关系
    如果换成jtds就不会报这个问题
      

  7.   

    解决方法是在存储过程开始处增加一条语句:SET NOCOUNT ON