我需要获取所有应用程序数据库,并且我已经能够通过
select name from sys.database where database_id > 6
现在,我需要运行以下查询:
select
User_FirstName
, User_Name
, User_Id
, User_ReadAccess
from
[name obtained from sys.databases].dbo.ADMN_User_Details
这是我到目前为止所写的,我在以下位置收到错误database_Name.dbo.ADMN.User_Details
:
declare @database_name varchar(50)
declare @User_FirstName varchar (50)
declare @User_Name varchar (50)
declare @User_Access int
declare @User_Id varchar (50)
declare Maximizer cursor FOR
select name from sys.databases
where database_id > 6
open Maximizer
fetch next from Maximizer into @database_name
while (@@FETCH_STATUS=0)
begin
select
@User_FirstName, @User_Name, @User_Id, @User_Access
from
@database_Name.dbo.ADMN.User_Details
end
close Maximizer
deallocate Maximizer
有人可以在这里帮助我吗?
Thanks
只要您在系统管理上下文中而不是在野外使用动态 SQL,就可以使用动态 SQL 来实现此目的。
--@sql holds your dynamic sql, @db holds the current DB
declare @sql varchar(1000)
declare @db varchar(100)
--populate your list of databases through which you'll iterate.
select name, 0 as run
into #dbs
from sys.databases where database_id > 6
--a while loop in sql...don't tell Jeff Moden
while exists (select 1 from #dbs where run = 0)
begin
set @db = (select top 1 name from #dbs where run = 0 order by name)
set @sql = '
select ''' + @db + '''
, User_FirstName
, User_Name
, User_Id
, User_ReadAccess
from '+ @db +'.dbo.ADMN_User_Details'
exec(@sql)
update #dbs
set run = 1
where name = @db
end
有几点需要记住:
- 动态 SQL 变量需要足够长才能保存 SQL 内容和数据库名称。
- 我将 sys.database 更改为 sys.databases 因为这是表的名称
- 如果您需要聚合用户名、ID 和读取访问权限的列表,我建议创建另一个临时表。这可能是一个好主意,因为如果您有很多数据库,您的结果集可能会有点难以管理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)