Ste*_*zer 6 sql sql-server stored-procedures
我在单个SQL Server 2008 R2上有许多不同的数据库.为了论证,让我们称它们为DB_A,DB_B和DB_C.我被要求开发为存储过程,它将存在于DB_A上.此存储过程将用于删除和创建索引,并在DB_A上的表中存储有关索引的一些额外信息.当从DB_C或DB_C调用此存储过程时,它将能够在调用数据库上删除并创建索引,但在DB_A上的表中存储有关索引的额外信息.
这就是我想要做的事情:我希望存储过程能够获取调用数据库的名称,而不必请求数据库名称作为参数.
这是一个简单的例子:
USE [DB_A]
CREATE PROC sp_WhatDatabaseAmICallingFrom
AS
BEGIN
DECLARE @calling_db NVARCHAR(128)
SET @calling_db = DB_NAME()
PRINT 'calling database: ' + @calling_db
END
Run Code Online (Sandbox Code Playgroud)
当我在DB_A中执行存储过程时...
EXEC sp_WhatDatabaseAmICallingFrom
Run Code Online (Sandbox Code Playgroud)
...它返回:" 调用数据库:DB_A "
当我在DB_B中执行存储过程时...
USE DB_B
GO
EXEC DB_A.dbo.sp_WhatDatabaseAmICallingFrom
Run Code Online (Sandbox Code Playgroud)
...它返回:" 调用数据库:DB_A ".
在阅读了各种SQL Server元数据函数之后,这正是它应该做的.但我想要的是更改代码,以便它将@calling_db设置为调用数据库的名称,以便我的示例存储过程将打印:" 调用数据库:DB_B ".
不幸的是,我找不到任何能够做到这一点的元数据功能.关于如何做到这一点的任何想法?
要使 SP 在当前连接的上下文中运行,您需要在master数据库上创建 SP并将其设为系统对象。
USE MASTER
GO
CREATE PROC sp_WhatDatabaseAmICallingFrom
AS
BEGIN
DECLARE @calling_db NVARCHAR(128)
SET @calling_db = DB_NAME()
PRINT 'calling database: ' + @calling_db
END
GO
EXEC sp_ms_marksystemobject 'sp_WhatDatabaseAmICallingFrom'
GO
Run Code Online (Sandbox Code Playgroud)
检查它是如何工作的:
USE [DB_A]
GO
EXEC sp_WhatDatabaseAmICallingFrom
GO
Run Code Online (Sandbox Code Playgroud)