Verwendung von Variablen in outer Join
Erst seit kurzer Zeit arbeite ich auch mit MS-SQL-Server 2008. Ich bin dabei auf ein Problem gestossen, für das ich bis jetzt keine Lösung finde. Wer kann helfen?
Ich habe hier ein Stück Code aus einer Procedure welches nicht korrekt arbeitet. Es werden keine Daten zurück geliefert, obwohl für das Datum @bildat Records vorhanden sind.
create proc dbo.sp_abc_123
@bildat DateTime = Null
as
if @bildat is Null
set @bildat = DATEADD(dd,-1,DATEADD(mm,DATEDIFF(m,0,getdate()), 0))
select a.feld_1,
b.feld_2,
...
from PRD..USR.TAB_A a
left outer Join PRD..USR.TAB_B b
on ( ( a.key_a1 = b.key_1 ) and ( b.datum = @bildat ) )
where ...
and ...
Kann in der outer Join Bedingung mit Variablen gearbeitet werden?
Grüsse
MSSQL4Me
Ich habe hier ein Stück Code aus einer Procedure welches nicht korrekt arbeitet. Es werden keine Daten zurück geliefert, obwohl für das Datum @bildat Records vorhanden sind.
create proc dbo.sp_abc_123
@bildat DateTime = Null
as
if @bildat is Null
set @bildat = DATEADD(dd,-1,DATEADD(mm,DATEDIFF(m,0,getdate()), 0))
select a.feld_1,
b.feld_2,
...
from PRD..USR.TAB_A a
left outer Join PRD..USR.TAB_B b
on ( ( a.key_a1 = b.key_1 ) and ( b.datum = @bildat ) )
where ...
and ...
Kann in der outer Join Bedingung mit Variablen gearbeitet werden?
Grüsse
MSSQL4Me
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 136527
Url: https://administrator.de/forum/verwendung-von-variablen-in-outer-join-136527.html
Ausgedruckt am: 11.04.2025 um 12:04 Uhr
8 Kommentare
Neuester Kommentar

Hallo mssql4me!
Also, dass kann schonmal nicht funktionieren:
Müsste wohl eher in dieser Richtung lauten (Intervalle als Text)
Gruß Dieter
Also, dass kann schonmal nicht funktionieren:
DATEADD(dd,-1,DATEADD(mm,DATEDIFF(m,0,getdate()), 0)) |
Müsste wohl eher in dieser Richtung lauten (Intervalle als Text)
set @bildat = DATEADD("d",-1,DATEADD("m",DATEDIFF("m",0,getdate()), 0)) |
Gruß Dieter
Hallo MSSQL4Me,
mit Deinem Codeschnippsel ist erst mal alles in Ordnung, Variablen kann man da auch verwenden.
Es kann also eigentlich nur die Verknüpfung über key_1 sein oder aber, Du hast in Deinen Datumsfeldern nicht nur das Datum, sondern auch Zeiten stehen. Wenn "... on ( ( a.key_a1 = b.key_1 ) and ( b.datum = '2010-01-31' ) ) ..." Ergebnisse liefert, dann sollte die Prozedur auch Ergebnisse liefern, wenn Du sie ohne Parameter bzw. mit @bildat = null aufrufst.
Ersetz doch mal
mit
Dann wären schonmal aus @bildat die Zeiten raus, ggf. müßte das auch noch mit b.Datum passieren.
Edit: das war natürlich Müll, da wär @bildat ja komplett verändert worden, habs gerade nochmal korrigiert.
Gruß, Mad Max
mit Deinem Codeschnippsel ist erst mal alles in Ordnung, Variablen kann man da auch verwenden.
Es kann also eigentlich nur die Verknüpfung über key_1 sein oder aber, Du hast in Deinen Datumsfeldern nicht nur das Datum, sondern auch Zeiten stehen. Wenn "... on ( ( a.key_a1 = b.key_1 ) and ( b.datum = '2010-01-31' ) ) ..." Ergebnisse liefert, dann sollte die Prozedur auch Ergebnisse liefern, wenn Du sie ohne Parameter bzw. mit @bildat = null aufrufst.
Ersetz doch mal
if @BilDat is Null
set @BilDat = DATEADD(dd,-1,DATEADD(mm,DATEDIFF(m,0,getdate()), 0))
if @BilDat is Null
set @BilDat = DATEADD(d,-1,DATEADD(m,DATEDIFF(m,0,getdate()), 0))
else
set @BilDat = DATEADD(d,DATEDIFF(d,0,@BilDat), 0))
Dann wären schonmal aus @bildat die Zeiten raus, ggf. müßte das auch noch mit b.Datum passieren.
Edit: das war natürlich Müll, da wär @bildat ja komplett verändert worden, habs gerade nochmal korrigiert.
Gruß, Mad Max

Hallo mssql4me!
Mit den Stringzeichen habe ich mich wohl geirrt, aber ich habe mal Deine Date-Funktion in Excel getestet und mit
bekomme ich als Ergebnis den 27.02.2010. Von daher dürfte es nicht funktionieren
Wobei das Ergebnis z.B. mit
der 21.02.2010 wäre
Gruß Dieter
Mit den Stringzeichen habe ich mich wohl geirrt, aber ich habe mal Deine Date-Funktion in Excel getestet und mit
x = DateAdd("d", -1, DateAdd("m", DateDiff("m", 0, Date), 0)) |
Wobei das Ergebnis z.B. mit
x = DateAdd("d", -1, Date) |
Gruß Dieter

Hallo mssql4me!
Beispiel für den 31.01.2010 in Excel (in SQL entsprechend anpassen)
Der letzte Tag des Vormonats ließe sich, falls vorhanden mit Dateserial() in Kombination mit DateAdd ermitteln
Ohne DateSerial dann so:
Wobei DateSerial den aktuellen Monat mit dem 1. Tag bestimmt und DateAdd -1 Tag den letzten Tag des Vormonats.
Gruß Dieter
Beispiel für den 31.01.2010 in Excel (in SQL entsprechend anpassen)
Der letzte Tag des Vormonats ließe sich, falls vorhanden mit Dateserial() in Kombination mit DateAdd ermitteln
x = DateAdd("d", -1, DateSerial(Year(Date), Month(Date), 1)) |
x = DateAdd("d", -1, "01" & "-" & Month(Date) & "-" & Year(Date)) |
Gruß Dieter
Moin MSSQL4Me,
DATEADD(dd,-1,DATEADD(mm,DATEDIFF(m,0,getdate()), 0)) bringt, zumindest auf dem SQL Server 2005, derzeit den 31.01.2010. Deswegen die Frage, ob Du die Prozedur ohne Parameter probiert hast, denn dann müßte das Datum stimmen. Wenn "print @bildat " aber kein gescheites Datum gebracht hat, bzw. ein seltsames Format, dann frage ich mich, wie Euer SQL Server konfiguriert ist, oder was Du für Variablen verwendest. Probier mal "print convert (varchar (30), @bildat, 120)", wenn Dir das nicht etwas in der Form "2010-01-31 00:00:00" zurückgibt, dann stimmt was nicht. Vielleicht kannst Du ja auch mal hier reinschreiben, was Dein print zurückgeliefert hat.
Achja, was passiert eigentlich, wenn Du den 31.01.2010 nicht explizit in der Abfrage verwendest, aber explizit @bildat zuweist? Was passiert, wenn Du das "if @bildat is Null" wegläßt und immer dieses berechnete Datum zuweist?
Gruß, Mad Max
DATEADD(dd,-1,DATEADD(mm,DATEDIFF(m,0,getdate()), 0)) bringt, zumindest auf dem SQL Server 2005, derzeit den 31.01.2010. Deswegen die Frage, ob Du die Prozedur ohne Parameter probiert hast, denn dann müßte das Datum stimmen. Wenn "print @bildat " aber kein gescheites Datum gebracht hat, bzw. ein seltsames Format, dann frage ich mich, wie Euer SQL Server konfiguriert ist, oder was Du für Variablen verwendest. Probier mal "print convert (varchar (30), @bildat, 120)", wenn Dir das nicht etwas in der Form "2010-01-31 00:00:00" zurückgibt, dann stimmt was nicht. Vielleicht kannst Du ja auch mal hier reinschreiben, was Dein print zurückgeliefert hat.
Achja, was passiert eigentlich, wenn Du den 31.01.2010 nicht explizit in der Abfrage verwendest, aber explizit @bildat zuweist? Was passiert, wenn Du das "if @bildat is Null" wegläßt und immer dieses berechnete Datum zuweist?
Gruß, Mad Max