gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:12:15 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com