Variable für Use Tabelle erstellen funktioniert nicht

Tschabo

Benutzer
Beiträge
14
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.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.690
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.
 

Tschabo

Benutzer
Beiträge
14
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.
 

ukulele

Datenbank-Guru
Beiträge
4.690
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?
 

Tschabo

Benutzer
Beiträge
14
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 :(
 

ukulele

Datenbank-Guru
Beiträge
4.690
Und du hast das auch zusammengefasst zu einem Statement, so wie ich im Beispiel? Ist es in beiden Fällen die selbe Fehlermeldung?
 

Tschabo

Benutzer
Beiträge
14
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.
 

ukulele

Datenbank-Guru
Beiträge
4.690
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)
 

Tschabo

Benutzer
Beiträge
14
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
 
Werbung:
Oben