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)
只需在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)