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

SQL liefert falsche Werte bei IS NULL

Frage Entwicklung Datenbanken

Mitglied: lombaseggel

lombaseggel (Level 1) - Jetzt verbinden

19.06.2009, aktualisiert 10:28 Uhr, 3806 Aufrufe, 11 Kommentare

Hallo alle zusammen,

wir haben hier ein mittelgroßes Problem und eins vorweg, ich bin alles andere als ein SQL Profi
Wir benutzen Access schon seit ein paar Jahren um auf unserem MS SQL 2000 Server Abfragen zu erstellen.
In letzter Zeit haben wir ab und zu mal bei einer monatlichen Abfrage das Phenomen das falsche Werte geliefert werden.

Die Sicht beinhaltet das Kriterium FELD1 = IS NULL
d.h. nur die Datensätze bei denen kein Wert eingetragen ist sollen in einem späteren Schritt angezeigt werden.
Ab und zu rutscht aber immer wieder ein Feld rein das aber einen Wert enthällt!
Ich finde dann auf dem Ausdruck der Datensätze, vereinzelt welche bei denen das Feld einen Inhalt hat, und das teilweise schon seit Jahren.

Wir kann das sein? Hat jemand von euch eine Idee wo hier evnt das Problem verborgen sein könnte? Kann der SQL sich z.B "verschlucken"? Die Abfragen sind sehr groß und erstrecken sich über ca 45.000 Datensätze. Leider ist unser Entwickler der das "System" entwickelt hat nicht mehr im Unternehmen.

Über Ideen würde ich mich freuen den ich bin am Ende mit meinem Latein.

Vielen Dank für eure Hilfe
Mitglied: Biber
19.06.2009 um 10:44 Uhr
Moin lombaseggel,

willkommen im Forum.

Auch wenn ich fest davon ausgehen, dass "FELD1 = IS NULL" ein Tippfehler ist und in Wirklichkeit "FELD1 IS NULL" dort steht - bitte poste doch die Abfrage.

Das Access eventuell Datensätze verschluckt, nur weil das irgendwelche Redmonder zusammengeschrotet haben - nein, das können wir ausschließen.


Grüße
Biber
Bitte warten ..
Mitglied: lombaseggel
19.06.2009 um 10:49 Uhr
Danke schon mal für die Antwort,
ja es war ein Tippfehler Es geht um die SageBelegnummer

hier der Syntax:

SELECT dbo.MT_Zertifikate.Zert_Nr, dbo.MT_Zertifikate.Ausgang, dbo.MT_Zertifikate.Zertifizierdatum, dbo.MT_Zertifikate.Zertifikatstyp,
dbo.MT_Zertifikate.SageBelegnummer, dbo.getsamount(dbo.MT_Zertifikate.Zertifikatstyp) AS [Amount S], dbo.MT_Zertifikate.LaborID,
dbo.MT_Zertifikate.LocalProjectNo, dbo.MT_Zertifikate.S_Number, dbo.MT_Zertifikatstyp.Beschreibung, dbo.MT_Zertifikate.ZID,
dbo.MT_Zertifikate.ProductID, dbo.MT_Zertifikate.gültig_bis, dbo.MT_Zertifikate.Zurückziehdatum, dbo.MT_Zertifikate.Produktbez_engl,
dbo.MT_Zertifikate.Typ_eng, dbo.MT_Adressen.AdressID, dbo.MT_Adressen.Abkürzung, dbo.MT_Zertifikate.ModSpecial
FROM dbo.MT_Zertifikate INNER JOIN
dbo.MT_Zertifikatstyp ON dbo.MT_Zertifikate.Zertifikatstyp = dbo.MT_Zertifikatstyp.Zertifikatstyp INNER JOIN
dbo.MT_Auftrag ON dbo.MT_Zertifikate.AID = dbo.MT_Auftrag.AID INNER JOIN
dbo.MT_Adressen ON dbo.MT_Auftrag.KID = dbo.MT_Adressen.AdressID
WHERE (dbo.MT_Zertifikate.Ausgang IS NOT NULL) AND (dbo.MT_Zertifikate.Zertifizierdatum >= CONVERT(DATETIME, '2006-01-01 00:00:00', 102)) AND
(dbo.MT_Zertifikate.SageBelegnummer IS NULL) AND (dbo.MT_Zertifikate.Zertifikatstyp = 1 OR
dbo.MT_Zertifikate.Zertifikatstyp = 6 OR
dbo.MT_Zertifikate.Zertifikatstyp = 2 OR
dbo.MT_Zertifikate.Zertifikatstyp = 8 OR
dbo.MT_Zertifikate.Zertifikatstyp = 9 OR
dbo.MT_Zertifikate.Zertifikatstyp = 12 OR
dbo.MT_Zertifikate.Zertifikatstyp = 10 OR
dbo.MT_Zertifikate.Zertifikatstyp = 11 OR
dbo.MT_Zertifikate.Zertifikatstyp = 13 OR
dbo.MT_Zertifikate.Zertifikatstyp = 14 OR
dbo.MT_Zertifikate.Zertifikatstyp = 7 OR
dbo.MT_Zertifikate.Zertifikatstyp = 5 OR
dbo.MT_Zertifikate.Zertifikatstyp = 16 OR
dbo.MT_Zertifikate.Zertifikatstyp = 15 OR
dbo.MT_Zertifikate.Zertifikatstyp = 18 OR
dbo.MT_Zertifikate.Zertifikatstyp = 3 OR
dbo.MT_Zertifikate.Zertifikatstyp = 19)
Bitte warten ..
Mitglied: dog
19.06.2009 um 11:13 Uhr
Ich hab mir das SQL zwar noch nicht angeschaut aber zwei Dinge vorweg:

1. NULL und "Feld ist leer" sind zwei verschiedene Dinge. NULL ist ein konkreter Feldwert, eine Prüfung auf "Leer" sähe anders aus.

2. Dein SQL etwas geordnet

01.
SELECT  
02.
	dbo.MT_Zertifikate.Zert_Nr,  
03.
	dbo.MT_Zertifikate.Ausgang,  
04.
	dbo.MT_Zertifikate.Zertifizierdatum,  
05.
	dbo.MT_Zertifikate.Zertifikatstyp, 
06.
	dbo.MT_Zertifikate.SageBelegnummer, 
07.
	dbo.getsamount(dbo.MT_Zertifikate.Zertifikatstyp) AS [Amount S],  
08.
	dbo.MT_Zertifikate.LaborID, 
09.
	dbo.MT_Zertifikate.LocalProjectNo,  
10.
	dbo.MT_Zertifikate.S_Number,  
11.
	dbo.MT_Zertifikatstyp.Beschreibung,  
12.
	dbo.MT_Zertifikate.ZID, 
13.
	dbo.MT_Zertifikate.ProductID,  
14.
	dbo.MT_Zertifikate.gültig_bis,  
15.
	dbo.MT_Zertifikate.Zurückziehdatum,  
16.
	dbo.MT_Zertifikate.Produktbez_engl, 
17.
	dbo.MT_Zertifikate.Typ_eng,  
18.
	dbo.MT_Adressen.AdressID,  
19.
	dbo.MT_Adressen.Abkürzung,  
20.
	dbo.MT_Zertifikate.ModSpecial 
21.
FROM  
22.
	dbo.MT_Zertifikate  
23.
INNER JOIN 
24.
	dbo.MT_Zertifikatstyp ON dbo.MT_Zertifikate.Zertifikatstyp = dbo.MT_Zertifikatstyp.Zertifikatstyp  
25.
INNER JOIN 
26.
	dbo.MT_Auftrag ON dbo.MT_Zertifikate.AID = dbo.MT_Auftrag.AID  
27.
INNER JOIN 
28.
	dbo.MT_Adressen ON dbo.MT_Auftrag.KID = dbo.MT_Adressen.AdressID 
29.
WHERE  
30.
	(dbo.MT_Zertifikate.Ausgang IS NOT NULL)  
31.
	AND  
32.
		(dbo.MT_Zertifikate.Zertifizierdatum >= CONVERT(DATETIME, '2006-01-01 00:00:00', 102))  
33.
		AND 
34.
			(dbo.MT_Zertifikate.SageBelegnummer IS NULL)  
35.
			AND  
36.
37.
					dbo.MT_Zertifikate.Zertifikatstyp = 1 OR 
38.
					dbo.MT_Zertifikate.Zertifikatstyp = 6 OR 
39.
					dbo.MT_Zertifikate.Zertifikatstyp = 2 OR 
40.
					dbo.MT_Zertifikate.Zertifikatstyp = 8 OR 
41.
					dbo.MT_Zertifikate.Zertifikatstyp = 9 OR 
42.
					dbo.MT_Zertifikate.Zertifikatstyp = 12 OR 
43.
					dbo.MT_Zertifikate.Zertifikatstyp = 10 OR 
44.
					dbo.MT_Zertifikate.Zertifikatstyp = 11 OR 
45.
					dbo.MT_Zertifikate.Zertifikatstyp = 13 OR 
46.
					dbo.MT_Zertifikate.Zertifikatstyp = 14 OR 
47.
					dbo.MT_Zertifikate.Zertifikatstyp = 7 OR 
48.
					dbo.MT_Zertifikate.Zertifikatstyp = 5 OR 
49.
					dbo.MT_Zertifikate.Zertifikatstyp = 16 OR 
50.
					dbo.MT_Zertifikate.Zertifikatstyp = 15 OR 
51.
					dbo.MT_Zertifikate.Zertifikatstyp = 18 OR 
52.
					dbo.MT_Zertifikate.Zertifikatstyp = 3 OR 
53.
					dbo.MT_Zertifikate.Zertifikatstyp = 19 
54.
				)
Grüße

Max
Bitte warten ..
Mitglied: lombaseggel
19.06.2009 um 11:18 Uhr
Ups, das mit der Formatierungshilfe ist mir absolut entgangen! Danke

Ok ich als SQL Laie dachte IS NULL bedeutet das Feld ist leer,
wenn IS NULL einen bestimmten Wert vorgibt könnte die Ursache darin liegen!?
Bitte warten ..
Mitglied: dog
19.06.2009 um 12:36 Uhr
Also prinzipiell sollte es nicht vorkommen, dass eine Spalte die mit "IS NULL" gebunden ist im Ergebnis konkrete Werte vorkommen.
Wenn du nur einmal folgenden Query ausführst, gibt es dann immer noch Spalten mit Werten?
SELECT * FRPM dbo.MT_Zertifikate WHERE SageBelegnummer IS NULL 
Welchen Spaltentyp hat SageBelegnummer?

Grüße

Max
Bitte warten ..
Mitglied: lombaseggel
19.06.2009 um 12:54 Uhr
Wenn ich die aktuelle Abfrage ausführe erscheinen auch keine Datensätze bei denen im Sage Feld etwas steht.
Das passiert nur sporadisch. Auch deine Abfrage liefert keine "falschen" Werte.

Der Datentyp ist nvarchar

Danke Gruss Marc
Bitte warten ..
Mitglied: filippg
20.06.2009 um 03:30 Uhr
Jaa... dann ändere doch eine Anfrage mal in (NOT ((dbo.MT_Zertifikate.Ausgang IS NULL) OR (dbo.MT_Zertifikate.Ausgang = '')))

Gruß

Filipp

PS: dieses NULL-Ding ist echt Teufelszeug, ich bin dem auch schon oft genug aufgesessen.
Bitte warten ..
Mitglied: lombaseggel
22.06.2009 um 10:13 Uhr
Das Problem bezog sich auf das Sagefeld das leer sein muss für diese Art von Vorgang.
Analog dazu:
(NOT ((dbo.MT_Zertifikate.Sage IS NULL) OR (dbo.MT_Zertifikate.Sage = '')))
?
Kannst du mir evnt etwas mehr erklären warum das NULL, Probleme macht/machen kann in deinen Augen?
Bzw worin jetzt genau der Unterschied liegt in der Behandlung von SQL Sicht aus.
Danke

gruss marc
Bitte warten ..
Mitglied: filippg
22.06.2009 um 14:45 Uhr
Zitat von lombaseggel:
Kannst du mir evnt etwas mehr erklären warum das NULL, Probleme
macht/machen kann in deinen Augen?
Ich dachte, das hättest du gerade selber festgestellt.
Fies finde ich etwa:
SELECT * FROM bla WHERE x = 5
Welche Abfrage liefert dann alle anderen Zeilen?
SELECT * FROM bla WHERE x != 5
würde man denken, ist aber natürlich falsch - wenn die Spalte x Null erlaubt.

Grundsätzlich hat man sich eine Bimodale Logik angewöhnt - es gibt TRUE oder FALSE, 0 oder 1, mehr nicht. NULL macht jetzt wieder ein Trimodale Logik daraus, neben True und False ist auf einmal Unknown erlaubt. Und das muss man halt bei jedem Query beachten. Und auch wenn man Funktionen oder gespeicherte Prozeduren nutzt muss man immer erstmal schauen, wie die sich bei NULL verhalten.
Um den Spaß zu erhöhen kann man im SQL-Server verschiedene Settings vornehmen, die das Verhalten (u.a.) bezgl. Null ändern. Damit ist dann z.B. wieder die (nicht ganz unintuitive) Klausel "x = NULL" zulässig, die vorher zwar keinen Syntaxfehler darstellt, aber leider keine Werte liefert.

Gruß

Filipp
Bitte warten ..
Mitglied: Biber
26.06.2009 um 00:28 Uhr
Öhhm, lombaseggel,

wie ist denn der gefühlte Status Deines Beitrags?

Sind noch Fragen offen, kann ein kleiner grüner Haken dran oder muss alles noch etwas reifen?

Gib doch mal Feedback bitte

Danke
Biber
Bitte warten ..
Mitglied: lombaseggel
26.06.2009 um 09:40 Uhr
muss noch etwas "reifen" wir sind leider noch nicht zur Umsetzung gekommen

Danke Gruss Marc
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...