SQL Server:要循环的查询
我需要获得所有的应用程序数据库,我已经能够通过SQL Server:要循环的查询,sql,sql-server,Sql,Sql Server,我需要获得所有的应用程序数据库,我已经能够通过 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 这就是我到目前为止所写的内
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
这就是我到目前为止所写的内容,我在数据库\u Name.dbo.ADMN.User\u详细信息中收到一个错误:
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
有人能帮我吗
谢谢
DB您需要使用动态sql在查询中连接变量名,例如:
DECLARE @sql
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 @sql VARCHAR(MAX)
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
PRINT @database_Name
SET @sql = '
select '+@User_FirstName+', '+@User_Name+', '+@User_Id+', '+@User_Access+' from '+@database_Name+'.dbo.ADMN.User_Details
'
EXEC (@sql)
end
close Maximizer
deallocate Maximizer
只要在系统管理上下文中使用动态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和读取访问的列表,我建议创建另一个临时表。这可能是个好主意,因为如果您有很多数据库,那么您的结果集可能会变得有点难以管理李>
“……我在……上遇到了一个错误。”错误是什么?@FreshPrinceOfSO,没有光标怎么办?轻视光标的使用是一种时尚,但这是完成某些任务的唯一有效方法。如果有一种更有效的方法,他们的效率会更低。这很有效。非常感谢你。我非常喜欢所有的建议。我需要一点修改。db_name()打印master作为数据库的名称。是否有方法将数据库名(@db)与其他用户相关信息一起打印?Good catch OP.db_name()获取运行查询的数据库。我更改了查询,通过在@db变量中进行解析(包含所有必要的记号),只需打印当前数据库中的任何内容。非常感谢您的帮助。现在完成了。谢谢你的回答。我收到一个错误-“将varchar值从转换为int数据类型时,转换失败”。我更改了select语句并能够更正错误。有没有办法,我可以把@database_名称和其他用户信息一起打印出来?再次感谢大家。如果您的变量不是varchar,那么如果使用字符串连接,您将不得不强制转换它们,但是您已经解决了这个问题,请随意编辑答案,以显示您在select语句中所做的不同操作。您可以在开始时添加打印命令,请参阅更新的答案。