我在单个 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/