0

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

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

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

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

4

3 回答 3

10

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

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

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

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

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

于 2012-07-31T16:08:16.630 回答
6

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

exec sp_ms_marksystemobject myprocname

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

于 2012-07-31T16:07:19.687 回答
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

通过首先在默认模式下探测所需名称和类型的对象来解决。如果找到,那就是用于解析引用的对象。如果没有找到这样的对象,则在 schema 下进行探测dbo

此外,您通常不应为存储过程命名以sp_: 开头的名称,这会进一步复杂化(并减慢)解析,从而将master数据库的探针混入其中。

于 2012-07-31T17:02:28.120 回答