如何返回在另一个数据库中调用存储过程的远程数据库名称?

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 ".

不幸的是,我找不到任何能够做到这一点的元数据功能.关于如何做到这一点的任何想法?

Sto*_*leg 4

要使 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)