sql - 如何返回在不同数据库中调用存储过程的远程数据库名称?

标签 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

当我在 DB_A 中执行存储过程时...
EXEC sp_WhatDatabaseAmICallingFrom

...它返回:“ 调用数据库:DB_A

当我在 DB_B 中执行存储过程时...
USE DB_B
GO

EXEC DB_A.dbo.sp_WhatDatabaseAmICallingFrom

...它返回:“ 调用数据库: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

检查它是如何工作的:
USE [DB_A]
GO

EXEC sp_WhatDatabaseAmICallingFrom
GO

关于sql - 如何返回在不同数据库中调用存储过程的远程数据库名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15976257/

相关文章:

sql - 通过选项参数构建 SQL SELECT 列

sql - 电话号码 : Using IF statements in a procedure produces multiple plans

c# - 为什么 C# round 和 SQL round 函数产生不同的输出?

mysql - 为什么银行或金融公司在其 "Core"系统中更喜欢 Oracle 而不是其他 RDBMS?

sql - 为什么 Postgres 执行计划会根据 where 条件发生巨大变化

mysql - 比较MySQL中两个表的数据

sql-server - 在 case 语句中转换 varchar 值时转换失败

c# - 存储过程上的 OdbcCommand - 输出参数出现 "Parameter not supplied"错误

mysql - SQL查询以获取相邻记录之间的差异

mysql - 导出sql查询结果时csv格式错误