通过远程删除存储过程

时间:2012-08-02 09:41:51

标签: java tsql stored-procedures sql-server-2000 junit4

我正在通过远程使用JUnit创建和测试存储过程,我的用户名是test,这是我的代码,

String sql = "create procedure test.firstProc3 AS select GETDATE()";
cursor.execute(sql);
cursor.executeQuery("firstProc3");

要放弃程序:

String dropSQL = "DROP PROCEDURE test.firstProc3";
cursor.execute(dropSQL);

由于Drop Procedure无效,我无法再次运行相同的SP(新会话)我的错误是:

已经有一个名为' firstProc3'在数据库中。

当我在服务器端提供 sp_help 时, 该表的行具有值

firstProc3测试存储过程

然而,当我给予 查询分析器中的DROP PROCEDURE test.firstProc3,该行将从表中删除。

尝试通过Junit执行相同操作可能会出现什么问题?

是否有权限设置?

PS - 用户测试启用了db_ddladmin。

3 个答案:

答案 0 :(得分:1)

我设法通过使用以下方法最终解决了问题:

declare @object_id int
select @object_id = object_id('test.firstProc5')
EXEC sp_MSdrop_object @object_id
GO

这也是从表中删除数据。我能够多次成功运行Testcase!

感谢您的帮助:)

我提到的链接就在这里,希望它对某人有所帮助:

http://www.mssqlcity.com/Articles/Undoc/SQL2000UndocSP.htm

答案 1 :(得分:0)

根据错误消息,我怀疑这是一个权限问题。一些你的光标对象在你试图放弃时再次运行创建,或者你在再次运行单元测试之前从未真正丢弃过程,或者某些测试的逻辑顺序不合适时尚。您是否可以实例化一个新的游标对象并尝试使用它删除,或使用profiler或某些调试输出验证对数据库运行的SQL?

除此之外,我很想知道更改SQL命令以检查proc存在是否会使错误消失(而不是这是正确答案):

if object_id('test.firstProc3') is null begin
    -- Dynamic SQL because create must be first in a batch
    exec ('create procedure test.firstProc3 as select getdate()') 
end

if object_id('test.firstProc3') is not null begin
    drop procedure test.firstProc3
end

答案 2 :(得分:0)

也许是小事,甚至可能不是这样,但你有没有试过在你的drop语句中使用转义?

类似

drop procedure [test].[firstProc3]

我记得当我从c#代码调用drop table时,我遇到了这个问题......