如果从sp过程调用(存储在master中),则不在当前数据库中执行sys.database_principals

时间:2013-02-20 13:51:13

标签: sql-server views catalog

我想在SP过程中打印出实际数据库的数据库用户(请参阅下面的sp_PrintUsers的代码),但是,由于某种原因,它打印出master的数据库用户。尽管在实际数据库中执行了任何数据库级SQL语句,但它似乎是所有数据库级视图的SP过程的一般行为。如果我们打印出DB_NAME它显然不是主人,那么有什么不对?

有解决方法吗?

use [master]
go
create procedure sp_PrintUsers
as
begin
    SELECT DB_NAME() AS DataBaseName
    select name from sys.database_principals;
end
go

use [actual_database]
go

exec sp_PrintUsers

2 个答案:

答案 0 :(得分:1)

尝试动态执行选择,如:

EXEC('select name from sys.database_principals;');

如果这无法帮助构建查询以引用具有三部分名称的目录视图。

答案 1 :(得分:0)

试试这个:

use [master]
go
create procedure sp_PrintUsers
as
begin
    declare @dbname varchar(30) = DB_NAME()
    EXEC ('select name from ' + @dbname + '.sys.database_principals');        
end
go

use [actual_database]
go

exec sp_PrintUsers