我需要在数据库服务器上创建一个一次且只在一个地方的存储过程,但是能够从任何数据库运行它。 但是,我不希望每次运行时都要输入{{1}}。我希望能够像内置程序一样使用它:database.schema.procedure_name
有没有办法做到这一点?
这是我正在尝试创建的过程:
sp_...
以下是我想从SQL Server Management Studio运行它的方法:
--actual procedure is more complex
CREATE PROCEDURE TestProcedure
AS
select * from sys.dm_exec_requests
go
然而,你得到这个错误:
EXEC TestProcedure
--or
TestProcedure
如果我用以下方式运行它,一切运行正常:
Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure 'TestProcedure'.
你可以运行这样的系统程序而不会出现任何错误:
EXEC master.dbo.TestProcedure
--or
master.dbo.TestProcedure
答案 0 :(得分: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"*/
修改强>
跟随Cade的评论,将其标记为系统程序。这似乎可能需要in some circumstances。在SQL 2005+中,您将使用
EXEC sys.sp_MS_marksystemobject 'dbo.sp_test'