2017-12-18 6 views
1

Ich versuche, SQL Server-Benutzer über LinkdedServers zu aggregieren, kann aber den Datenbanknamen in meiner Abfrage nicht auswählen. Ich versuchte, db_name() as ''Database'' In meiner Select-Anweisung zu verwenden, aber es verwendet den aktuellen Datenbankkontext und nicht die Datenbank, aus der ich auswähle. Ich stelle fest, dass dies geschieht, weil ich den "vollqualifizierten" Datenbanknamen verwende, so dass sich der Datenbankkontext niemals wirklich ändert. Ich bin auch nicht in der Lage, den Cursor-Wert als Teil meiner Select-Anweisung zu ziehen.Verwendung von Cursor-Wert in SELECT-Anweisung in Dynamic SQL (SQL Server)

Hat jemand irgendwelche Ideen, wie ich den Datenbanknamen der Datenbank bekommen kann, die ich auswähle?

Hier ist mein Code:

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  

Versuch, den Variablenwert zu verwenden:

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

Wenn ich das tue, erhalte ich folgende Fehlermeldung: Msg 207, Level 16, State 1, Line 5 Invalid column name 'myTestDatabase'.

Wie kann ich mich wenden die Variable in einer Zeichenfolge in dieser Situation?

+0

Sie haben den Datenbanknamen genau dort ... in der Variablen. Statt DB_NAME Verwendung '+ @DatabaseName +' als Datenbank –

+0

distinct (dp.name) SELECT als '' Database '', \t \t s.name als '' Servername '', \t \t '+ @DatabaseName +' als '' Datenbank '', \t \t getdate() als '' Datum '' Meine Syntax möglicherweise falsch, aber wenn ich das versuchte, erhalte ich die folgende Fehlermeldung: Msg 207, Ebene 16, Status 1, Zeile 5 Ungültiger Spaltenname 'mytestDatabase'. – user3220707

+0

Sie müssen es zu einer Zeichenfolge machen. Wahrscheinlich muss nur zu jeder Seite im String literal. Können Sie Ihren Code in der Frage veröffentlichen? Formatierung in den Kommentaren ist schrecklich. –

Antwort

2

Sie sollten sich daran gewöhnen, Spaltenaliase in einfache Anführungszeichen zu schreiben. Sie sind KEINE Zeichenfolgenliterale und es macht Ihren Code viel schwerer zu lesen. Es verursacht auch viel Angst mit dynamischen SQL.

Hier ist ein Beispiel, wie Sie den Wert in Ihrem Varail erfassen und diese Zeichenfolge ohne diese zusätzlichen einfachen Anführungszeichen erstellen würden.

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

Super, vielen Dank Sean! Ich habe es mit doppelten Anführungszeichen versucht, aber jetzt sehe ich, warum ich drei Ticks verwenden muss. Ich bin relativ neu bei t-sql und hatte Probleme, die Dokumentation zu durchsuchen, um an meiner Abfrage zu arbeiten. Ich baue auf bestehenden Code auf, werde aber versuchen, diese Art von Dingen in Zukunft zu vermeiden, da dies die Dinge verwirrender macht – user3220707