2

我正在使用 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。

4

3 回答 3

1

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

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

这也从表中删除了数据。我能够多次成功运行测试用例!

谢谢你的帮助 :)

我提到的链接在这里,希望它可以帮助某人:

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

于 2012-08-03T05:12:36.907 回答
0

根据错误消息,我怀疑这是权限问题。当您尝试删除时,您的光标对象似乎正在再次运行创建,或者在再次运行单元测试之前您从未真正删除 proc,或者测试以某种方式运行不符合逻辑顺序。您可以实例化一个新的游标对象并尝试使用它进行删除,或者使用分析器或一些调试输出验证正在针对数据库运行的 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
于 2012-08-02T14:12:59.540 回答
0

也许是一些小事,也许甚至不是这样,但是您是否尝试过在您的 drop 语句中使用转义?

就像是

drop procedure [test].[firstProc3]

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

于 2012-08-03T10:07:03.487 回答