Announcement

Collapse
No announcement yet.

Datenbankübergreifende View

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datenbankübergreifende View

    Hallo,

    ich muß eine View schreiben, in der auf eine andere Datenbanken zugegriffen wird.
    Das ist prinzipiell nicht so problematisch, wenn die Datenbanken nicht nur manchmal da wären.

    Ich hatte eigentlich an folgendes gedacht:
    USE db1
    go
    CREATE VIEW v_test ( vcol1, vcol2, vcol3) AS
    IF ( SELECT count(*) FROM table1 WHERE table1.col1 = 'A' ) > 0 BEGIN
    SELECT db2.dbo.table2.col1, db2.dbo.table2.col2, db2.dbo.table2.col3
    FROM db2.dbo.table2
    ELSE BEGIN
    SELECT db3.dbo.table2.col1, db3.dbo.table2.col2, db3.dbo.table2.col3
    FROM db3.dbo.table2
    END
    GO

    Durch das Select count(*) erkenne ich, ob db2 vorhanden ist, oder nicht. Wenn db2 nicht vorhanden ist, muß ein anderes Select ausgeführt werden oder nulls ausgegeben werden.

    Das funktioniert aber nicht.
    Hat jemand eine andere Idee?

    Gruß,
    Waterwalker

  • #2
    Hallo,

    in einem View kannst Du nur eine Select Anweisung angeben, keine anweisung wie IF.
    Das gehört in ein Stored Procedure.
    Olaf Helper

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

    Comment


    • #3
      Die Daten evtl. in einer Tabelle zwischenspeichern.
      Dann prüfen ob die Daten da sind und ggf. Fallback auf die älteren Daten aus der Zwischenspeichertabelle...

      If exist mal probiert auf ein SELECT? Hast aber glaube ich auch das Problem wenn der Server gar nicht antwortet.....

      Comment


      • #4
        Oder eine Stored Procedure bzw. eine Tabellenwertfunktion schreiben, die die Daten zurückgibt. Hier kann man nach Herzenslust mit IF & Co arbeiten.

        [highlight=sql]
        CREATE VIEW v_test
        AS
        SELECT * FROM funktion_test()
        GO
        [/highlight]

        So "verpacke" ich das dann, falls der Client ein Problem mit SPs hat (z.B. ODBC).

        Hast aber glaube ich auch das Problem wenn der Server gar nicht antwortet.....
        Das glaube ich auch.
        Eventuell kann man über den Agent einen Job ausführen lassen, der zyklisch die remote server abfragt und das Ergebnis irgendwo lokal vermerkt - dann weiss ich mit größerer Wahrscheinlichkeit, ob sich die Abfrage lohnen könnte oder nicht. Ganz beseitigt es das Problem leider nicht.

        Grüße
        Tino

        Edit: Das mit der SP hatte Olaf ja schon gesagt, sorry, hab'sch jetzt erst gesehen.
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment


        • #5
          Erst mal danke für die schnellen Antworten. Ich werde es mal mit der Tabellenwertfunktion versuchen.

          Comment


          • #6
            Hallo,

            in der Tabellenwertfunktion kann auf Datenbanken und Tabellen zugegriffen werden, die nicht existieren. Das Entscheidungskriterium, ob die Datenbank mit den Tabellen vorhanden ist, ist in meiner aktuellen Datenbank vorhanden. ( ist ein einfaches select ). Damit kann dann in einer IF-Bedingung entschieden werden, ob das Statement auf die Fremde Datenbank ausgeführt werden soll.

            Auf die Tabellenwertfunktion habe ich eine View geschrieben, die ich dann ganz normal ansprechen kann.

            Die Response-Zeiten sind sehr gut. Wenn die Fremddatenbank nicht da ist, und das Statement auf die DB geschickt wird, gibt es sofort die Meldung, das die entsprechende Tabelle nicht da ist.

            Vielen Dank nochmal.

            Wenn jemand ein Beispiel haben will, bitte Bescheid sagen.

            Gruß Waterwalker

            Comment


            • #7
              Wie prüfst du ob die Datenbank da ist?

              Comment


              • #8
                In meinem Fall reicht mir eine Modulprüfung. IF ( SELECT modul_an FROM module where modul_bezeichnung = 'Fremdsystem' ) = 'J' BEGIN....

                Eine Andere Möglichkeit währe evtl. über die Master-DB. Das IF ( SELECT count(*) FROM master.dbo.sysdatabases WHERE name = 'db2' ) > 0 BEGIN...

                Das ist bei mir aber nicht notwendig.

                Comment


                • #9
                  Für die, die es bisher noch nicht selber herausgefunden haben - so kann man prüfen, ob eine Datenbank oder Tabelle vorhanden ist:
                  http://www.sqlservercurry.com/2007/1...sts-using.html

                  bye,
                  Helmut

                  Comment

                  Working...
                  X