2

すべてのアプリケーション データベースを取得する必要があり、それを取得することができました。

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

誰かがここで私を助けてくれますか?

ありがとう

4

2 に答える 2

9

これをシステム管理のコンテキストで使用している限り、動的 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、および読み取りアクセスのリストを集約する必要がある場合は、別の一時テーブルを作成することをお勧めします。多くのデータベースがある場合、結果セットの管理が少し難しくなる可能性があるため、これは良い考えかもしれません。
于 2013-10-29T21:22:56.513 に答える
1

次のように、クエリで変数名を連結するには、動的 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
于 2013-10-29T21:22:24.533 に答える