Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: mssql4me

mssql4me (Level 1) - Jetzt verbinden

22.02.2010 um 09:09 Uhr, 3242 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
Datenbanken
MySQL - Join
Frage von ThoomaasDatenbanken4 Kommentare

Hallo alle zusammen! Ich habe zwei Tabellen in meiner Datenbank. Die eine beinhaltet Teams und einen Code zum Team ...

Batch & Shell
PowerShell Domain Join
gelöst Frage von Patrick-ITBatch & Shell2 Kommentare

Hallo zusammen, kann mir einer sagen wo der Fehler in meinem Code ist? Wenn ich ihn öffne passiert nichts. ...

LAN, WAN, Wireless
Ping in-out vs. out-in
Frage von bonitoLAN, WAN, Wireless25 Kommentare

Hallo Leute, ich habe eine Frage zu Pingzeiten. Wenn ich aus meinem LAN über meinen Router eine Adresse im ...

Datenbanken
Join über drei Tabellen
gelöst Frage von KimaroDatenbanken5 Kommentare

Hallo Admins, ich versuche gerade eine SQL Abfrage für meine Website zu basteln, aber irgendwie klappt das nicht so ...

Neue Wissensbeiträge
Windows 7
Updategängelung auf Windows 10, die zweite
Information von Penny.Cilin vor 1 TagWindows 7

Hallo, da Windows 7 im kommenden Jahr nicht mehr supportet wird, werden Nutzer von Window 7 home premium wieder ...

Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 3 TagenInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 4 TagenMicrosoft Office7 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 6 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Heiß diskutierte Inhalte
Notebook & Zubehör
Hardware defekt ?
Frage von mausemuckelNotebook & Zubehör14 Kommentare

Hallo und ein schönes Osterfest an alle. Ich benötige mal euer Schwarm wissen. Ich habe hier ein Notebook Lenovo ...

LAN, WAN, Wireless
Lancom und VLANs
Frage von TimmheLAN, WAN, Wireless11 Kommentare

Hallo an alle ich habe momentan ein sehr merkwürdiges problem bei dem ich nicht mehr weiter komme und hoffe ...

Netzwerkmanagement
Konfiguration von IPv6 in einer Domäne mit DHCP
Frage von gnoovyNetzwerkmanagement10 Kommentare

Hi Zusammen, ich bin gerade etwas am verzweifeln. Ich habe eine Testumgebung aufgebaut, um mich in das Thema IPv6 ...

Virtualisierung
Unix System virtualisieren
Frage von BananenmeisterVirtualisierung10 Kommentare

Hallo Zusammen, Ich möchte gerne eine Virtualisierungs-Software auf meinem kleinen ML Server installieren um einige Unix Systeme zu virtualisieren. ...