1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Variable für Use Tabelle erstellen funktioniert nicht

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Tschabo, 18 April 2019.

  1. Tschabo

    Tschabo Benutzer

    Hallo zusammen,



    in folgender Abfrage würde ich gerne einige Bereiche mit einer Variabel ersetzen.



    Die Abfrage würde ursprünglich so aussehen:


    ---------------------------------------------------------------------------------------------------------
    Use Serad_CDM_20190331

    SELECT *

    from [DATA].[tKDN] kdn

    where kdn.kdndateM > 20190331
    ---------------------------------------------------------------------------------------------------------


    Diese möchte ich wie folgt mit Variabel ersetzen:


    ---------------------------------------------------------------------------------------------------------
    declare @Ultimo_Serad_CDM nvarchar (1000)

    set @Ultimo_Serad_CDM = 'use SERAD_CDM_'+ convert(varchar(30),DATEADD(dd,-1,DATEADD(mm, DATEDIFF(m,0,getdate()) +0, 0)),112)+';'


    declare @aktuellUltimo datetime

    set @aktuellUltimo = DATEADD(dd,-1,DATEADD(mm, DATEDIFF(m,0,getdate()) +0, 0))


    exec (@Ultimo_Serad_CDM)

    SELECT *

    from [DATA].[tKDN] kdn

    where kdn.kdndateM > @aktuellUltimo
    ---------------------------------------------------------------------------------------------------------

    Das funktioniert auch bis auf den teil bzw. verweis auf die Datenbank und deren Stichtag(Ultimodatum)

    Use Serad_CDM_20190331

    Die Variabel (@Ultimo_Serad_CDM) wird nicht akzeptiert.

    Hab Ihr vielleicht eine Lösung für mich.
     
  2. ukulele

    ukulele Datenbank-Guru

    Ich glaube das der Teil der von exec() aufgerufen wird tatsächlich auf die richtige DB wechselt. Sobald aber das Statement abgeschlossen ist befindest du dich vermutlich wieder im selben Kontext wie zuvor.

    Probier mal deinen 2ten Select als Query an @Ultimo_Serad_CDM anzuhängen und beides gemeinsam mit EXEC auszuführen.
     
  3. Tschabo

    Tschabo Benutzer

    Leider nicht. Das Statement gibt gleich eine Fehlermeldung, dass die Daten nicht gefunden werden können. Das liegt daran dass die Daten aus dem Statement auf dem ultimo liegen und er diese nicht abruft. Das ist für mich der Beweis dass die Variable übergangen wird.
     
  4. ukulele

    ukulele Datenbank-Guru

    Was genau hast du den ausgeführt und wie lautet die Fehlermeldung? Ich meinte sowas wie:
    Code:
    declare @Ultimo_Serad_CDM nvarchar (1000)
    set @Ultimo_Serad_CDM = 'use SERAD_CDM_'+ convert(varchar(30),DATEADD(dd,-1,DATEADD(mm, DATEDIFF(m,0,getdate()) +0, 0)),112)+';'
    
    declare @aktuellUltimo datetime
    set @aktuellUltimo = DATEADD(dd,-1,DATEADD(mm, DATEDIFF(m,0,getdate()) +0, 0))
    
    SET       @Ultimo_Serad_CDM = @Ultimo_Serad_CDM + '
    SELECT *
    from [DATA].[tKDN] kdn
    where kdn.kdndateM > ''' + convert(VARCHAR(100),@aktuellUltimo,120) + ''''
    
    exec (@Ultimo_Serad_CDM)
    Wenn sich der Code nicht ausführen läßt, hat er denn die richtige Syntax? Hast du @aktuellUltimo im richtigen Format an den String angehängt?
     
  5. Tschabo

    Tschabo Benutzer

    Ja ich habe die Richtige Syntag und Ja ich habe das richtige Format. Wenn ich die Variabel mit
    Print @Ultimo_Serad_CDM
    ausführe bekomme ich
    use SERAD_CDM_20190331
    angezeigt. Das ist alles so korrekt.
    Die Fehlermeldung die ich erhalte lautet:
    Msg 208, Level 16, State 1, Line 33
    Ungültiger Objektname 'DATA.tKDN'.
    Das zeigt mir das die Variabel nicht bewirkt das auf die korrekte Datenbank gesprungen wird.
    Führe ich den befehl ohne Variabel aus --> ausgeschrieben (use SERAD_CDM_20190331)
    dann lauft das Statement ohne Probleme. Wie bereits geschrieben. Die Variabel wird nicht erkannt :(
     
  6. ukulele

    ukulele Datenbank-Guru

    Und du hast das auch zusammengefasst zu einem Statement, so wie ich im Beispiel? Ist es in beiden Fällen die selbe Fehlermeldung?
     
  7. Tschabo

    Tschabo Benutzer

    Sorry. Hab Tomaten auf den Augen. Hab nicht gesehen das du ein neues Statement geschrieben hast.
    Erhalte jetzt diese Fehlermeldung:

    Msg 242, Level 16, State 3, Line 2
    Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs.
     
  8. ukulele

    ukulele Datenbank-Guru

    Ja das ist etwas blöd weil du ja zum bauen des dynamischen SQL-Statements deinen DATETIME-Wert in VARCHAR konvertieren musst (passiert ja auch), leider nimmt er dann das Format nicht an. Warscheinlich wäre die sicherste Methode zweimal explizit zu konvertieren:
    Code:
    declare @Ultimo_Serad_CDM nvarchar (1000)
    set @Ultimo_Serad_CDM = 'use SERAD_CDM_'+ convert(varchar(30),DATEADD(dd,-1,DATEADD(mm, DATEDIFF(m,0,getdate()) +0, 0)),112)+';'
    
    declare @aktuellUltimo datetime
    set @aktuellUltimo = DATEADD(dd,-1,DATEADD(mm, DATEDIFF(m,0,getdate()) +0, 0))
    
    SET       @Ultimo_Serad_CDM = @Ultimo_Serad_CDM + '
    SELECT *
    from [DATA].[tKDN] kdn
    where kdn.kdndateM > convert(DATETIME,''' + convert(VARCHAR(100),@aktuellUltimo,120) + ''',120)'
    
    exec (@Ultimo_Serad_CDM)
     
  9. Tschabo

    Tschabo Benutzer

    Klasse so hat es geklappt :)
    Vielen Dank für deine Hilfe.
    Jetzt muss ich mal schauen wie ich das in meinem großen Statement einbaue.
    Du hast mir sehr weiter geholften.

    Gruß
    Gidon
     
  10. ukulele

    ukulele Datenbank-Guru

    Ja ich hoffe die Ursache ist klar :)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden