Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:要循环的查询_Sql_Sql Server - Fatal编程技术网

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语句中所做的不同操作。您可以在开始时添加打印命令,请参阅更新的答案。