2013-10-29 88 views
2

查詢循環我有一個要求獲得所有的應用程序的數據庫,我已經能夠獲得通過SQL服務器:通過

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 

有限公司有人請幫助我嗎?

感謝,

DB

+0

「...我得到一個錯誤......」有什麼錯誤? – zimdanen

+1

請勿使用遊標 – Kermit

+2

@FreshPrinceOfSO,如何在沒有遊標的情況下完成此操作? –

回答

9

您可以使用動態SQL這個只要你正在系統管理環境中使用它,而不是在野外。

[email protected] 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和讀訪問列表,我建議創建另一個臨時表。這可能是一個好主意,因爲如果你有很多數據庫,你的結果集可能會有點難以管理。
+0

它很好用。非常感謝你。真的很喜歡所有的建議。我需要一點修改。 db_name()打印master作爲數據庫的名稱。是否有辦法將數據庫名稱(@db)與其他用戶相關信息一起打印? – user2933907

+0

好抓住OP。 db_name()獲取運行查詢的數據庫。我通過在@db變量中解析(使用所有必需的記號),將查詢更改爲簡單地打印當前數據庫的任何內容。 –

+0

非常感謝您的幫助。這現在完成了。 – user2933907

0

你需要使用動態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 '[email protected]_FirstName+', '[email protected]_Name+', '[email protected]_Id+', '[email protected]_Access+' from '[email protected]_Name+'.dbo.ADMN.User_Details 
' 
EXEC (@sql) 
end 

close Maximizer 
deallocate Maximizer 
+0

感謝您的回答。我得到一個錯誤 - 「將varchar值轉換爲數據類型int時轉換失敗」。我改變了選擇語句,並能夠糾正錯誤。有沒有辦法,我可以打印@database_name以及其他用戶信息?再次感謝一堆。 – user2933907

+0

如果你的變量不是varchar,那麼如果連接字符串,你將不得不施放它們,但是你已經修復了這個問題,隨意編輯答案以顯示你在select語句中做了不同的處理。您可以在開始時添加PRINT命令,查看更新的答案。 –