AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [MSSQL] Problem bei Konvertierung in Case-Verzweigung
Thema durchsuchen
Ansicht
Themen-Optionen

[MSSQL] Problem bei Konvertierung in Case-Verzweigung

Ein Thema von Evian · begonnen am 7. Apr 2008 · letzter Beitrag vom 8. Apr 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#1

[MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 17:34
hallo Zussamen,

ich sitze gerade an einer etwas größeren SQL-Abfrage, in der es unter anderem ein paar Spalten gibt, bei denen zur gleichen Zeit immer nur eine einen "richtigen" Wert haben kann (die anderen sind Null). Nun möchte ich die Abfrage so gestallten, dass praktisch nur noch eine Spalte gibt, also dass ich sie z.B. durch Case-Verzewigungen zusammenführe.

SQL-Code:
Nummer = CASE WHEN dbo.tEingangsrechnung.Eingangsrechnungsnummer IS NOT NULL
                      THEN dbo.tEingangsrechnung.Eingangsrechnungsnummer ELSE CASE WHEN dbo.tKassenbuchung.Belegnummer IS NOT NULL
                      THEN dbo.tKassenbuchung.Belegnummer ELSE CASE WHEN tEingangsrechnung_1.Eingangsrechnungsnummer IS NOT NULL
                      THEN tEingangsrechnung_1.Eingangsrechnungsnummer ELSE CASE WHEN dbo.tAusgangsrechnung.Ausgangsrechnungsnummer IS NOT NULL
                      THEN dbo.tAusgangsrechnung.Ausgangsrechnungsnummer ELSE CASE WHEN dbo.tDauerauftrag.Dauerauftragsnummer IS NOT NULL
                      THEN dbo.tDauerauftrag.Dauerauftragsnummer ELSE CASE WHEN dbo.tSonstigeZahlungenEinnahmen.SZENummer IS NOT NULL
                      THEN dbo.tSonstigeZahlungenEinnahmen.SZENummer ELSE CASE WHEN dbo.tSonstigeZahlungenAusgaben.SZANummer IS NOT NULL
                      THEN dbo.tSonstigeZahlungenAusgaben.SZANummer ELSE NULL END END END END END END END
Der Syntax der Abfrage ist soweit in Ordnung (zumindest meckert der SQL Query Analyzer nicht rum), nur versucht der SQL-Server aus irgend einem Grund das Ergebniss der Verzeigung in eine Variabel vom Typ in zu pressen.

Zitat:
Server: Nachr.-Nr. 245, Schweregrad 16, Status 1, Zeile 1
Syntaxfehler beim Konvertieren des nvarchar-Wertes 'SZA000759' in eine Spalte vom Datentyp int.
meine Frage wäre nun, ob jemand weiß, wie ich angeben kann, dass 'Nummer' vom Typ nvarChar sein soll? Außerdem würde ich gern wissen, ob es für mein Problem noch eine elegantere Lösung gibt, als diese verschachtelten CASE-Verzeigungen.

Vielen Dank und freundliche Grüße,

Phill
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 17:40
Versuch es mal mit CAST
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#3

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 17:49
Das habe ich schon probiert, nur weiß ich nicht genau, wie und wo ich das cast anwenden soll...

bei Nummer = Cast(CASE WHEN dbo.tEingangsrechnung.Eingangsrechnungsnummer... ...END END as NVARCHAR) bekomme ich die selbe Fehlermeldung wie vorher, was ja auch logisch ist, denn anscheinend ist ja Nummer vom Typ int.

und bei Cast(Nummer = CASE WHEN dbo.tEingangsrechnung.Eingangsrechnungsnummer... ...END END as NVARCHAR) bekomme ich den Syntaxfehler
Zitat:
Server: Nachr.-Nr. 170, Schweregrad 15, Status 1, Zeile 2
Zeile 2: Falsche Syntax in der Nähe von '='.
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 18:01
THEN CAST( tEingangsrechnung_1.Eingangsrechnungsnummer as ...
Markus Kinzler
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#5

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 18:03
Hi,

also wesendlich einfacher geht es so:
SQL-Code:
Nummer = coalesce( dbo.tEingangsrechnung.Eingangsrechnungsnummer,
                   dbo.tKassenbuchung.Belegnummer,
                   dbo.tEingangsrechnung_1.Eingangsrechnungsnummer,
                   dbo.tAusgangsrechnung.Ausgangsrechnungsnummer,
                   dbo.tDauerauftrag.Dauerauftragsnummer,
                   dbo.tSonstigeZahlungenEinnahmen.SZENummer,
                   dbo.tSonstigeZahlungenAusgaben.SZANummer,
                   '<alles null>'
                 )
Dann kannst du auch einfacher casten, wenn immer noch nötig...
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#6

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 18:24
coalesce ist auf jeden Fall schon mal sehr schön.. trotzdem kommt immernoch der selbe Fehler. Ein Cast auf die übergebenen Werte ist ja auch eigentlich quatsch, denn der Fehler rührt ja in diesem speziellen Fall daher, dass sich in der Spalte SZANummer, der Tabelle tSonstigeZahlungenAusgaben in irgendeiner Zeile der nvarchar-Wert 'SZA000759' befindet. Ihn noch ein mal in NVARCHAR zu Casten wäre dann ja 'doppelt gemoppelt' und führt zwangsläufig zu dem selben Fehler. Es muss doch irgendwie möglich sein, anzugeben, dass Nummer vom typ nvarchar ist und nicht, wie der Server aus welchem Grund auch immer annimmt, dass es sich um einen den typ int handelt, oder?!

EDIT:

Hier mal meine gesammte abfrage, ich sehe zwar keinen Fehler, aber vielleicht habe ich irgendetwas anderes falsch gemacht?!

SQL-Code:
SELECT TOP 100 PERCENT dbo.sUmbuchung_Anteil.*, COALESCE (tEingangsrechnung_1.Eingangsrechnungsnummer, dbo.tKassenbuchung.Belegnummer,
                      tEingangsrechnung_1.Eingangsrechnungsnummer, dbo.tAusgangsrechnung.Ausgangsrechnungsnummer, dbo.tDauerauftrag.Dauerauftragsnummer,
                      dbo.tSonstigeZahlungenEinnahmen.SZENummer, dbo.tSonstigeZahlungenAusgaben.SZANummer, NULL) AS Eingangsrechnungsnummer,
                      tKontenbuchung.Betrag AS RechnungBetrag, tKontenbuchung.Verwendung AS RechnungVerwendung,
                      tKontenbuchung.Zahlungsempfaenger AS RechnungZahlungsempfaenger, tKontenbuchung.Buchungsdatum AS RechnungBuchungsdatum,
                      dbo.tKontenbuch.PK_tKontenbuch AS PK_tKontenbuchRechnung
FROM dbo.tSonstigeZahlungenAusgaben RIGHT OUTER JOIN
                      dbo.sUmbuchung_Anteil ON
                      dbo.tSonstigeZahlungenAusgaben.PK_tSonstigeZahlungenAusgaben = dbo.sUmbuchung_Anteil.FK_tSonstigeZahlungenAusgaben LEFT OUTER JOIN
                      dbo.tSonstigeZahlungenEinnahmen ON
                      dbo.sUmbuchung_Anteil.FK_tSonstigeZahlungenEinnahmen = dbo.tSonstigeZahlungenEinnahmen.PK_tSonstigeZahlungenEinnahmen LEFT OUTER JOIN
                      dbo.tAusgangsrechnung ON dbo.sUmbuchung_Anteil.FK_tAusgangsrechnung = dbo.tAusgangsrechnung.PK_tAusgangsrechnung LEFT OUTER JOIN
                      dbo.tDauerauftrag ON dbo.sUmbuchung_Anteil.FK_tDauerauftrag = dbo.tDauerauftrag.PK_tDauerauftrag LEFT OUTER JOIN
                      dbo.tEingangsrechnung tEingangsrechnung_1 ON
                      dbo.sUmbuchung_Anteil.FK_tEingangsrechnung = tEingangsrechnung_1.PK_tEingangsrechnung LEFT OUTER JOIN
                      dbo.tKassenbuchung ON dbo.sUmbuchung_Anteil.FK_Kassenbuchung = dbo.tKassenbuchung.PK_tKassenbuchung LEFT OUTER JOIN
                      dbo.tKonto INNER JOIN
                      dbo.tKontenbuch ON dbo.tKonto.PK_tKonto = dbo.tKontenbuch.FK_tKonto INNER JOIN
                      dbo.tKontenbuchung tKontenbuchung ON dbo.tKontenbuch.PK_tKontenbuch = tKontenbuchung.FK_tKontenbuch ON
                      dbo.sUmbuchung_Anteil.FK_tKontenbuchung = tKontenbuchung.PK_tKontenbuchung LEFT OUTER JOIN
                      dbo.tEingangsrechnung tEingangsrechnung_2 INNER JOIN
                      dbo.tRechnung_Teilzahlung INNER JOIN
                      dbo.tKontenbuchung_Rechnung ON
                      dbo.tRechnung_Teilzahlung.PK_tRechnung_Teilzahlung = dbo.tKontenbuchung_Rechnung.FK_tRechnung_Teilzahlung INNER JOIN
                      dbo.tRechnung ON dbo.tRechnung_Teilzahlung.FK_tRechnung = dbo.tRechnung.PK_tRechnung ON
                      tEingangsrechnung_2.FK_tRechnung = dbo.tRechnung.PK_tRechnung ON
                      tKontenbuchung.PK_tKontenbuchung = dbo.tKontenbuchung_Rechnung.FK_tKontenbuchung
ORDER BY tEingangsrechnung_1.Eingangsrechnungsnummer
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#7

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 19:11
Hi,

SQL-Code:
Nummer = convert(nvarchar,
          coalesce( dbo.tEingangsrechnung.Eingangsrechnungsnummer,
                     dbo.tKassenbuchung.Belegnummer,
                     dbo.tEingangsrechnung_1.Eingangsrechnungsnummer,
                     dbo.tAusgangsrechnung.Ausgangsrechnungsnummer,
                     dbo.tDauerauftrag.Dauerauftragsnummer,
                     dbo.tSonstigeZahlungenEinnahmen.SZENummer,
                     dbo.tSonstigeZahlungenAusgaben.SZANummer,
                     '<alles null>'
                   ) )
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#8

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 19:25
nö... löst das Problem ebenso nicht.
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 19:29
Jedes einzelne Argument muss auf NVarChar gecastet werden, also so etwa:
coalesce (cast (Field1 as NVarChar),cast (Field2 as NVarChar), ...) Ich vermute mal, das das erste Argument vom Typ INT ist und MSSQL dann alle weiteren Argumente implizit in eben dieses INT konvertieren will.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: [MSSQL] Problem bei Konvertierung in Case-Verzweigung

  Alt 7. Apr 2008, 22:44
Hier mein Vorschlag...

SQL-Code:
SELECT @Nummer = COALESCE(
                   CONVERT(VARCHAR, dbo.tEingangsrechnung.Eingangsrechnungsnummer),
                   CONVERT(VARCHAR, dbo.tKassenbuchung.Belegnummer),
                   CONVERT(VARCHAR, tEingangsrechnung_1.Eingangsrechnungsnummer),
                   CONVERT(VARCHAR, dbo.tAusgangsrechnung.Ausgangsrechnungsnummer),
                   CONVERT(VARCHAR, dbo.tDauerauftrag.Dauerauftragsnummer),
                   CONVERT(VARCHAR, dbo.tSonstigeZahlungenEinnahmen.SZENummer),
                   CONVERT(VARCHAR, dbo.tSonstigeZahlungenAusgaben.SZANummer)
                 )
Gruss
Thorsten

PS: ich weiss, jetzt geht wieder der CONVERT-Schnack los...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz