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'.
私は変えることができますどのようにこの状況では変数は文字列に変換されますか?
変数にはデータベース名があります。代わりDB_NAME使用の '+ @DatabaseName +' データベース –
が異なる(dp.name)を選択するように '' でdatabaseUser ''、 'サーバー名 ''' として \t \t s.name、\t \t '+ @DatabaseName +' と同じくらい\t \t getdate() 'date' ' 構文が間違っている可能性がありますが、試してみると、次のエラーメッセージが表示されます。メッセージ207、レベル16、状態1、行5 無効な列名 'mytestDatabase'です。 – user3220707
文字列にする必要があります。おそらく文字列リテラルの両側にある必要があります。質問にあなたのコードを投稿できますか?コメントの書式設定はひどいです。 –