如何创建实用程序存储过程并像其他sp _...实用程序一样运行它

xyz*_*xyz 3 t-sql sql-server sql-server-2005

我需要在我的数据库服务器上一次创建一个存储过程,但是能够从任何数据库运行它. 但是,我不希望database.schema.procedure_name每次运行它都要输入. 我希望能够使用它像内置的程序:sp_... 有没有办法做到这一点?

这是我正在尝试创建的过程:

--actual procedure is more complex
CREATE PROCEDURE TestProcedure
AS

select * from sys.dm_exec_requests 

go
Run Code Online (Sandbox Code Playgroud)

这是我想从SQL Server Management Studio运行它的方式:

EXEC TestProcedure
--or 
TestProcedure
Run Code Online (Sandbox Code Playgroud)

但是,你得到这个错误:

Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure 'TestProcedure'.
Run Code Online (Sandbox Code Playgroud)

如果我运行它,一切运行正常:

EXEC master.dbo.TestProcedure
--or
master.dbo.TestProcedure
Run Code Online (Sandbox Code Playgroud)

您可以运行这样的系统过程而不会出现任何错误:

EXEC sp_help
--or
sp_help
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 5

只需在master数据库中创建它并给它sp_前缀,它就可以工作.SQL Server始终首先检查master数据库中是否存在具有此前缀的存储过程(以及其他类型的对象).

它将为您以及下面处理数据库上下文.

USE master

create proc [dbo].[sp_test] as
select db_name()

GO

USE YourDB

EXEC master..sp_test  /*Returns "master"*/
EXEC sp_test          /*Returns "YourDB"*/
Run Code Online (Sandbox Code Playgroud)

编辑:

只需跟进Cade的评论就可以将其标记为系统程序.这似乎在某些情况下可能是必需的.在SQL 2005+中你会使用

EXEC sys.sp_MS_marksystemobject 'dbo.sp_test'
Run Code Online (Sandbox Code Playgroud)