2017-12-18 30 views
1

SQL ServerユーザーをLinkedServersで集計しようとしていますが、クエリでデータベース名を選択できません。私はdb_name() as ''Database''を使用しようとしましたが、私のselectステートメントでは、現在のデータベースコンテキストを使用していますが、私が選択しているデータベースではありません。私は、 "完全修飾"データベース名を使用しているので、データベースコンテキストが実際に変更されることはないので、これが発生することを認識しています。私はまた、私の選択ステートメントの一部としてカーソル値を引き込むことができません。動的SQL(SQL Server)内のSelectステートメントでカーソル値を使用する方法

私が選択しているデータベースのデータベース名を取得する方法については、誰にも分かりますか?ここで

は私のコードです:変数の値を使用する

DECLARE @DatabaseName VARCHAR(30) 

DECLARE c1 CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR 
SELECT 
    Name 
FROM 
    [LinkedServer].master.sys.databases 
WHERE 
    Name NOT IN  (
        'master', 
        'model', 
        'tempdb', 
        'msdb', 
        'distribution', 
        ) 


OPEN c1 

FETCH NEXT FROM c1 
INTO @DatabaseName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

EXEC (
' 
--INSERT INTO [Gather_Privileged_DBUsers_Sox] 
SELECT distinct (dp.name) as ''DatabaseUser'', 
     s.name as ''ServerName'', 
     db_name() as ''Database'', 
     getdate() as ''date'' 
FROM [LinkedServer].[' + @DatabaseName + '].sys.database_role_members drm 
     JOIN [LinkedServer].[' + @DatabaseName + '].sys.database_principals dp 
      ON drm.member_principal_id = dp.principal_id 
     JOIN [LinkedServer].[' + @DatabaseName + '].sys.database_principals dp2 
      ON drm.role_principal_id = dp2.principal_id 
     JOIN [LinkedServer].[master].[sys].[servers] s on 1=1 
WHERE 
     dp2.name in 
(''db_owner'',''db_accessadmin'',''db_securityadmin'',''db_ddladmin'') 
     AND s.server_id = 0 
     AND dp.name not in (''dbo'') 
     AND dp.type != ''R'' 
') 

FETCH NEXT FROM c1 
INTO @DatabaseName 
END 
CLOSE c1; 
DEALLOCATE c1; 
GO  

試み:私はこれを行うと

SELECT distinct (dp.name) as ''DatabaseUser'', 
     s.name as ''ServerName'', 
     ' + @DatabaseName + ' as ''Database'', 
     getdate() as ''date'' 

は、私は次のエラーを取得する:Msg 207, Level 16, State 1, Line 5 Invalid column name 'myTestDatabase'.

私は変えることができますどのようにこの状況では変数は文字列に変換されますか?

+0

変数にはデータベース名があります。代わりDB_NAME使用の '+ @DatabaseName +' データベース –

+0

が異なる(dp.name)を選択するように '' でdatabaseUser ''、 'サーバー名 ''' として \t \t s.name、\t \t '+ @DatabaseName +' と同じくらい\t \t getdate() 'date' ' 構文が間違っている可能性がありますが、試してみると、次のエラーメッセージが表示されます。メッセージ207、レベル16、状態1、行5 無効な列名 'mytestDatabase'です。 – user3220707

+0

文字列にする必要があります。おそらく文字列リテラルの両側にある必要があります。質問にあなたのコードを投稿できますか?コメントの書式設定はひどいです。 –

答えて

2

カラムエイリアスを一重引用符で囲む習慣から脱出する必要があります。それらは文字列リテラルではなく、コードを読みにくくします。また、動的SQLでは多くの悩みを引き起こします。

ここに、あなたのvaraibleの値をキャプチャし、余分な一重引用符を使わずにこの文字列を作成する方法の例を示します。

declare @SQL nvarchar(max) = 
'SELECT distinct (dp.name) as DatabaseUser, 
     s.name as ServerName, 
     ''' + @DatabaseName + ''' as Database, 
     getdate() as [date]' 
+0

素晴らしいです、ありがとうSean!私は二重引用符でそれを試しましたが、なぜ私は3つのダニを使用する必要があるのか​​分かります。私は比較的新しいt-SQLを使用していて、クエリを処理するためにドキュメントを調べるのに問題がありました。私は既存のコードをビルドしていますが、将来的にはこの種のものを避けようとします。状況がより混乱するためです – user3220707

関連する問題