需要将存储过程移动到系统存储过程文件夹中

时间:2012-07-31 15:49:00

标签: sql sql-server stored-procedures

当我以某种方式创建存储过程时,我设法将其放在存储过程文件夹中,但不在 system 存储过程文件夹中(系统SP文件夹存在于存储过程文件夹中)。如何将其向下移动一级到系统存储过程文件夹?

编辑:在阅读下面的答案后,我认为问题是我告诉我的C#程序访问存储过程。我有这行代码抛出异常,告诉我它无法找到它:

SqlCommand cmd = new SqlCommand("<database_name>.dbo.<stored_procedure_name>.sql", conn);

如果有人可以提供有关如何正确调用存储过程的任何帮助,我们将不胜感激。 THX!

3 个答案:

答案 0 :(得分:10)

你没有,或者至少不应该。

这适用于system存储过程,这些存储过程内置于RDBMS中并用于system函数,例如重命名对象或检查服务器上的用户。

不要将这些视为文件系统中的文件夹 - 他们只是根据现有的元数据(Stored procedureViewSystem对象或{组织对象{1}}对象?)

您可以将它标记为系统对象,但这只是一个糟糕的主意。

为什么要混淆你的程序?如果你正在创建它,它显然是一个用户程序而不是系统程序。

答案 1 :(得分:6)

我真的不确定你为什么需要这样做,但你可以:

exec sp_ms_marksystemobject myprocname

它没有文档 - 所以如果您尝试使用它,我将不会获得任何支持,并且可能会从SQL Server的未来版本中删除它。

答案 2 :(得分:1)

+1 @ JNK上面的评论。

另外,请确保您已根据自己认为的架构创建了存储过程。如果你执行这样的语句:

create procedure foobar as ...

存储过程foobar是在默认架构下创建的,可能不是dbo。您应始终创建和引用至少具有2级架构限定名称的数据库对象:

create procedure dbo.foobar ...
create procedure some_schema.foobar ...

以免你在脚下射击。您还应该对参考进行模式限定。参考文献如

select * from some_table
exec some_stored_procedure

而不是

select * from dbo.some_table
exec dbo.some_stored_procedure
通过首先在默认架构下探测所需名称和类型的对象来解决

。如果找到,那就是用于解析引用的对象。如果未找到此类对象,则在模式dbo下进行探测。

此外,您通常不应该为存储过程提供以sp_开头的名称:这会进一步使解决方案复杂化(并降低速度),将master数据库的探测器投入混合。