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

Frage Entwicklung Datenbanken

Mitglied: mssql4me

mssql4me (Level 1) - Jetzt verbinden

22.02.2010 um 09:09 Uhr, 3187 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
Stringsoperation unter Verwendung von Variablen
gelöst Frage von tegwertBatch & Shell1 Kommentar

Hallo zusammen! Mit folgendem Script verändere ich den Inhalt einer Variable : Das Ergebnis "istein" wird korrekt ausgegeben. Nun ...

Batch & Shell
Verwendung einer gesetzten Variable noch in derselben Eingabezeile
gelöst Frage von EvaEdenBatch & Shell9 Kommentare

Liebe Gemeinde, ich habe ein simples Problem: Ich muss ein paar Befehle in einer Zeile abschicken. Kein Problem, da ...

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
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 ...

Neue Wissensbeiträge
Verschlüsselung & Zertifikate

Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows

Information von ticuta1 vor 2 StundenVerschlüsselung & Zertifikate

Interessant SSH-Kommando in CMD.exe und PowerShell

Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 1 TagApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 1 TagWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 1 TagWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Heiß diskutierte Inhalte
Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server19 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Kein Bild mit nur einer bestimmten Grafikkarten - Mainboard Konfiguration
gelöst Frage von bestelittHardware18 Kommentare

Hallo zusammen, ich hatte schon einmal eine ähnliche Frage gestellt. Damals hatte ich genau das gleiche Problem. Allerdings lies ...

Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement17 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...