【问题标题】:How to select database name in sys.dm_*如何在 sys.dm_* 中选择数据库名称
【发布时间】:2020-11-27 10:09:19
【问题描述】:
我正在通过服务调用存储过程。我希望我的存储过程在数据库上运行。
我有两个问题
- sys.dm_* 表是特定于数据库的还是通用的?
select * FROM sys.dm_exec_requests
上面的查询是返回所有数据库的请求还是当前正在执行查询的数据库?
- 如果 sys.dm_* 特定于数据库,是否有任何方法可以通过存储过程指定数据库。我知道我们不能使用
use。 select * FROM [dbname].sys.dm_exec_requests 似乎不起作用。它返回当前数据库的结果。我在这里可能错了。
【问题讨论】:
标签:
sql
sql-server
system-tables
【解决方案1】:
看起来dm_* 表对系统来说是全局的。语句select * from [dbname].sys.dm_exec_requests 返回服务器上所有数据库的数据。如果表包含特定于数据库的数据,那么它将包含一个database_id 字段。
如果您想将存储过程返回的数据限制在一个数据库中,那么您必须符合database_id 的条件。以下两个语句都适用于存储过程:
/* specify the database name manually */
declare @db_name sysname = 'master'
select *
from sys.dm_exec_requests er
inner join sys.databases d on er.database_id = d.database_id
where d.name = @db_name
/* gets the database name for the current database */
select *
from sys.dm_exec_requests er
inner join sys.databases d on er.database_id = d.database_id
where d.name = db_name()