1

请参阅代码中的注释。

use master
go

create database db1
create database db2
go

-------------------------------
use db2
go

create procedure proc2
as begin
    -- how I can figure out that this proc2 is called 
    -- 1. from proc1 which is contained in the db1 (case N1)
    -- 2. or from context of db1 (case N2)
    select DB_NAME()
end
go

-------------------------------
use db1
go

create procedure proc1
as begin
    exec db2.dbo.proc2
end
go

select DB_NAME();

-- case N1
exec dbo.proc1;

-- case N2
exec db2.dbo.proc2;


-------------------------------
use master
go

drop database db1
drop database db2

输出

db1
db2
db2
4

2 回答 2

0

如果我没记错的话,我认为这是不可能的。

有一个解决方法,您可以在 proc2 中添加一个额外的输入参数并将信息传递给它。

于 2013-08-22T11:40:49.333 回答
0

proc2这是原始脚本,但根据我在此处的回答进行了快速更改。(请注意,sys.dm_tran_locks需要“查看服务器状态”权限才能使用。)

输出

db1
db1
db1

脚本

use master
go

create database db1
create database db2
go

-------------------------------
use db2
go

create procedure proc2
as begin
    DECLARE @result nvarchar(128);
    SELECT TOP 1 @result = DB_NAME(resource_database_id) 
        FROM sys.dm_tran_locks 
        WHERE request_session_id = @@SPID 
            AND resource_type = 'DATABASE' 
            AND request_owner_type = 'SHARED_TRANSACTION_WORKSPACE' 
        ORDER BY IIF(resource_database_id != DB_ID(), 0, 1);
    SELECT @result;
end
go

-------------------------------
use db1
go

create procedure proc1
as begin
    exec db2.dbo.proc2
end
go

select DB_NAME();

-- case N1
exec dbo.proc1;

-- case N2
exec db2.dbo.proc2;


-------------------------------
use master
go

drop database db1
drop database db2
于 2019-02-26T16:52:35.127 回答