none
eine Abfrage über mehrere Datenbanken RRS feed

  • Frage

  • Hallo,

    ich bin auf der Suche nach einem Datensatz aus einer Tabelle.

    Ich habe nun auf einem Server n Datenbanken. Sie alle haben diese Tabelle.

    Ich bin nun dabei einen Script zu basteln, dass alle DB´s auf dem Server abgefragt werden.

    Ich habe nun folgendes:

    EXEC sp_MSforeachdb
    @command1='use ?; .......

    Weiss jetzt aber nicht, was ich für ne prozedur ausführen soll oder ne Abfrage, damit er über alle DB´s geht....

    Danke für jeden Tipp

    Montag, 19. März 2012 10:53

Antworten

  • Hallo,

    die (nicht supported) sp_MSforeachdb ersetzt im @command1 Statement das Fragezeichen durch den jeweiligen Datenbanknamen, wobei das für alle vorhandene Datenbanken erfolgt. In Deinem Beispiel wird dann durch das USE zu der jeweiligen Datenbank im aktuellen Kontext gewechselt. Einfacher geht es noch, wenn Du den vollqualifizierten Objektnamen verwendest.

    Das Beispiel hier listet Dir alle Tabellennamen aus allen Datenbanken auf:

    EXEC sp_MSforeachdb @command1 = 'SELECT name FROM [?].sys.tables';


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Montag, 19. März 2012 12:28
  • Nein, das mit sys.tables war doch nur ein Beispiel, weil es die View in allen Datenbanken gibt und man es so ausprobieren kann.

    Du musst statt sys.tables einfach nur Deine Tabelle verwenden.

    select TabelleA.SpalteA from [?]..TabelleA where SpalteA like 'gesuchter Wert'

    In den Systemdatenbanken wird das wohl Fehler werfen, den dort ist Deine Tabelle ja wohl nicht auch angelegt.

    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Montag, 19. März 2012 22:23
  • Oder Du versuchst es so:

    EXEC sp_MSForEachDB 'IF EXISTS(SELECT * FROM [?]..sysobjects WHERE [Name] =
    ''Tabellenname'' AND xtype=''U'')
    SELECT TabelleA.SpalteA 
    FROM [?]..TabelleA
    WHERE SpalteA = ''WERT'''


    Gruß Falk
    Blog Falk Krahl

    Dienstag, 20. März 2012 12:38

Alle Antworten

  • Hallo,

    die (nicht supported) sp_MSforeachdb ersetzt im @command1 Statement das Fragezeichen durch den jeweiligen Datenbanknamen, wobei das für alle vorhandene Datenbanken erfolgt. In Deinem Beispiel wird dann durch das USE zu der jeweiligen Datenbank im aktuellen Kontext gewechselt. Einfacher geht es noch, wenn Du den vollqualifizierten Objektnamen verwendest.

    Das Beispiel hier listet Dir alle Tabellennamen aus allen Datenbanken auf:

    EXEC sp_MSforeachdb @command1 = 'SELECT name FROM [?].sys.tables';


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Montag, 19. März 2012 12:28
  • ja..genau, das hab ich versucht auszudrücken.

    Aber wenn du sagst:

    SELECT name FROM [?].sys.tables

    dann geht er doch durch alle tabellen von jeder DB.

    müsste ich dann nicht ergänzen sowas wie:

    SELECT name FROM [?].sys.tables like TabelleA where (select TabelleA.SpalteA from TabelleA where SpalteA like 'gesuchter Wert')

    Also, dass er eine ganz bestimmte Tabelle aus der DB ansteuert, wo die Tabelle einen entsprechenden Eintrag hat.
    1. Tabelle finden: erster select
    2. Einen Eintrag in der Tabelle finden: Subselect

    Montag, 19. März 2012 21:50
  • Nein, das mit sys.tables war doch nur ein Beispiel, weil es die View in allen Datenbanken gibt und man es so ausprobieren kann.

    Du musst statt sys.tables einfach nur Deine Tabelle verwenden.

    select TabelleA.SpalteA from [?]..TabelleA where SpalteA like 'gesuchter Wert'

    In den Systemdatenbanken wird das wohl Fehler werfen, den dort ist Deine Tabelle ja wohl nicht auch angelegt.

    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Montag, 19. März 2012 22:23
  • Oder Du versuchst es so:

    EXEC sp_MSForEachDB 'IF EXISTS(SELECT * FROM [?]..sysobjects WHERE [Name] =
    ''Tabellenname'' AND xtype=''U'')
    SELECT TabelleA.SpalteA 
    FROM [?]..TabelleA
    WHERE SpalteA = ''WERT'''


    Gruß Falk
    Blog Falk Krahl

    Dienstag, 20. März 2012 12:38
  • Hallo BLRBeginner,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 27. März 2012 13:39
    Moderator