Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Verwendung von Variablen in outer Join

Frage Entwicklung Datenbanken

Mitglied: mssql4me

mssql4me (Level 1) - Jetzt verbinden

22.02.2010 um 09:09 Uhr, 3168 Aufrufe, 8 Kommentare

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
Mitglied: 76109
22.02.2010 um 10:10 Uhr
Hallo mssql4me!

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
Bitte warten ..
Mitglied: mssql4me
22.02.2010 um 11:09 Uhr
Hallo Dieter

herzlichen Dank für Deine Antwort. Ich hab's ausprobiert - aber leider funktioniert es so immer noch nicht - egal ob ich bei DATEADD (datepart , number, date ) die "datepart" Argument mit oder ohne " " angebe.

Weiter hab ich noch versucht:
...
left outer Join PRD..USR.TAB_B b
on ( ( a.key_a1 = b.key_1 ) and ( b.datum = '2010-01-31' ) )
where ...

so funktioniert's - d.h ich bekomme so alle records - nur kann ich das Datum in der Procedure nicht fest einbauen, daher die Variable @BilDat

Grüsse
MSSQL4Me
Bitte warten ..
Mitglied: MadMax
22.02.2010 um 12:30 Uhr
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
01.
if @BilDat is Null 
02.
set @BilDat = DATEADD(dd,-1,DATEADD(mm,DATEDIFF(m,0,getdate()), 0))
mit
01.
if @BilDat is Null 
02.
set @BilDat = DATEADD(d,-1,DATEADD(m,DATEDIFF(m,0,getdate()), 0)) 
03.
else 
04.
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
Bitte warten ..
Mitglied: 76109
22.02.2010 um 12:48 Uhr
Hallo mssql4me!

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))
bekomme ich als Ergebnis den 27.02.2010. Von daher dürfte es nicht funktionieren

Wobei das Ergebnis z.B. mit
x = DateAdd("d", -1, Date)
der 21.02.2010 wäre

Gruß Dieter
Bitte warten ..
Mitglied: mssql4me
22.02.2010 um 16:15 Uhr
Hallo Mad Max

auch dir Danke für deine Antwort, aber leider sind auch mit Deinen Angaben immer noch keine Records da. Die Verknüpfung über key_1 ist korrekt, das habe ich schon untersucht. Ich habe (wie Du auch) den Verdacht dass mit @BilDat nicht '2010-01-31' daher kommt... aber ich habe keine Ahnung, wie ich das verifizieren kann. Ein Versuch mit:

print @BilDat

brachte auch keine weiteren Ideen, ausser dass ich noch mehr verwirrt war, da das Datum in einem anderen Format angezeigt wird???

Grüsse MSSQL4Me
Bitte warten ..
Mitglied: 76109
22.02.2010 um 17:06 Uhr
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
x = DateAdd("d", -1, DateSerial(Year(Date), Month(Date), 1))
Ohne DateSerial dann so:
x = DateAdd("d", -1, "01" & "-" & Month(Date) & "-" & Year(Date))
Wobei DateSerial den aktuellen Monat mit dem 1. Tag bestimmt und DateAdd -1 Tag den letzten Tag des Vormonats.


Gruß Dieter
Bitte warten ..
Mitglied: MadMax
22.02.2010 um 21:34 Uhr
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
Bitte warten ..
Mitglied: mssql4me
23.02.2010 um 12:08 Uhr
Hallo Mad Max

vielen Dank für deine Zeilen, da stecken ja ganz viele Ideen drin, ich versuch mal alles zu beantworten:

Die Bestimmung des Datums für @BilDat bringt auch bei mir (auch unter SQL Server 2005) jeweils das Monatsende des Vormonats zurück -> das ist auch so beabsichtigt.

Der print @BilDat bringt aktuell Jan 31 2010 12:00AM zurück. Definiert habe ich für @BilDat Datetime (habe auch schon mit smalldatetime versucht)

Wenn ich deine print Anweisung einbaue, also print convert (varchar (30), @BilDat, 120) erhalte ich "2010-01-31 00:00:00"
Auch schon probiert habe ich print convert (varchar (10), @BilDat, 120) dann wird nur das Datum ohne Zeit geliefert.


Die Procedur wird jeweils immer mit 2 - 3 Variante getestet, also so:

exec dbo.sp_abc_123 Null
exec dbo.sp_abc_123 '2010-01-31'
oder auch
exec dbo.sp_abc_123 '2009-12-31'

Meine Absicht ist - aber das habt Ihr sicher alle längst erkannt - mit "Null" das Datum automatisch zu erhalten (Monatsletzter Vormonat) aber auch die Möglichkeit zu haben, über ein altes Monatsende die Daten abzurufen. Die Procedure wird über einen Job mit Schedule jeweils am 1.Tag des Monats gestartet...

Deine letzten Angaben habe ich noch nicht getestet, werde ich aber noch angehen... ich melde mich sicherlich nochmal, um die Resultate durchzugeben.

Herzlichen Dank schon mal, und bis bald

Grüsse MSSQL4Me

---
Hallo zusammen

Also die letzten beiden Punkte habe ich jetzt auch noch getestet.

alter proc dbo.sp_abc_123
@BilDat DateTime = Null
as
set @BilDat = '2010-01-31 00:00:00'
-- set @BilDat = '2010-01-31'
-- set @BilDat = DATEADD(d,-1,DATEADD(m,DATEDIFF(m,0,getdate()), 0))

print convert(varchar(30), @BilDat, 120);
...

bei allen 3 Fällen ist die Ausgabe des print Befehls 2010-01-31 00:00:00

aber es werden keine Records zurückgeliefert.

Grüsse MSSQL4Me
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst Powershell - Verwendung von PSSession erzeugt Fehlermeldung (2)

Frage von Dani zum Thema Batch & Shell ...

Windows Server
gelöst WDS - mit optionalen Domain Auto-join? (1)

Frage von JiggyLee zum Thema Windows Server ...

Batch & Shell
gelöst Erstellen von Verknüpfungen mithilfe einer Variablen (3)

Frage von ciNNEx zum Thema Batch & Shell ...

Sonstige Systeme
UEFI Variablen beim Bootvorgang - Herunterfahren? (4)

Frage von Kedakai zum Thema Sonstige Systeme ...

Neue Wissensbeiträge
Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(29)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Humor (lol)

Bester Vorschlag eines Supporttechnikers ever: APC

(15)

Erfahrungsbericht von DerWoWusste zum Thema Humor (lol) ...

Windows Server

Exchange 2010 Active Directory und Windows Server 2016

(4)

Erfahrungsbericht von Herbrich19 zum Thema Windows Server ...

Heiß diskutierte Inhalte
Internet
gelöst Mitarbeiter surft auf unerwünschter Seite - Wie damit umgehen? (52)

Frage von sabines zum Thema Internet ...

Netzwerke
LAN2LAN Verbindung sehr langsam flaschenhals gesucht (27)

Frage von PixL86 zum Thema Netzwerke ...

Router & Routing
PFsense - Netzverbindung steht, aber kein Internet vorhanden (24)

Frage von aschmid zum Thema Router & Routing ...

Windows Server
gelöst Windows 2016 Hyper-V und VHDS (19)

Frage von emeriks zum Thema Windows Server ...