Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - SQL Abfrage mit IIF


Nordstern - Mi 01.12.10 13:06
Titel: SQL Abfrage mit IIF
Hallo,

ich versuche im Dataset-Designer (Visual Studio 2008) eine Spalte in einer Tableadapter mit folgender Abfrage zu erstellen.

SELECT *,
IIf(Format([Datum],"dd")>30,"gross","klein") AS Test
FROM tabelleXY

Die Verbindung erfolgt über OLBDB auf eine Access 2003 Datenbank.
Die Abfrage liefert das gewünschte Ergebniss, jedoch erhalte ich folgende Fehlermeldung:

Fehler in der Liste der Funktionsargumente ">" wurde nicht erkannt.

Somit kann ich das Ergebniss nicht weiterverwenden.

Kann mir jemend helfen??
Vielen Dank im vorraus.


Trashkid2000 - Do 02.12.10 23:47

Hallo,

user profile iconNordstern hat folgendes geschrieben Zum zitierten Posting springen:

Die Abfrage liefert das gewünschte Ergebniss, jedoch erhalte ich folgende Fehlermeldung:

Fehler in der Liste der Funktionsargumente ">" wurde nicht erkannt.

Wie jetzt? Ich kenne keine SQL-Statements, die einerseits eine Fehlermeldung ausgeben, anderseits aber das richtige Ergebnis.
Es gibt eigentlich gar kein IIf in T-SQL. Dazu diese Seite:
http://www.insidesql.org/blogs/frankkalis/2004/07/13/iif-in-t-sql

Sieht so aus, als ob Du das in ein CASE pumschreiben musst.
Marko


Trashkid2000 - Fr 03.12.10 08:32

Hmm, ich glaube, dass es das Format auch nicht so in T-SQL gibt.
Aber so müsste es gehen:

SQL-Anweisung
1:
2:
SELECT *, CASE WHEN DAY([Datum]) > 30 THEN 'gross' ELSE 'klein' END
FROM tabelleXY;
LG


jaenicke - Fr 03.12.10 10:35

user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
Es gibt eigentlich gar kein IIf in T-SQL.
Das stimmt nicht. Access 2003 kennt sehr wohl ein iif. Du kannst damit allerdings leider keine weitere Auswertung vornehmen. Deshalb kannst du kein > oder < oder so als Operator darin benutzen.

Für so etwas geht wirklich nur case. Nichtsdestotrotz gibt es iif, nur ist es eben nicht so mächtig.


Nordstern - So 05.12.10 19:01

Hallo, Danke für die Informationen. Leider ist mein Problem noch nicht gelöst. Wahrscheinlich habe ich die Frage nicht richtig formuliert.
Ich arbeite im Designer mit einem Table-Adapter-Konfiguration-Assistent. Wenn ich im Abfragegenerator mein SQL eintrage und dann den Button 'Abfrage ausführen' bekomme ich mit IIF das richtige Ergebniss. Jedoch beim Fertigstellen des Assitenten bekomme ich die genannte Fehlermeldung.

Wenn ich

SELECT CASE WHEN [DAY]([Datum]) > 30 THEN 'gross' ELSE 'klein' END AS XYZ
FROM tabelleXY

benutze erhalte ich folgende Fehlermeldung:

E_FAIL(ox80004005) in IErrorInfo.Get.Description

Vieleicht hat noch jemand eine Idee.

Vielen Dank


jaenicke - So 05.12.10 19:08

user profile iconNordstern hat folgendes geschrieben Zum zitierten Posting springen:
SELECT CASE WHEN [DAY]([Datum]) > 30 THEN 'gross' ELSE 'klein' END AS XYZ
FROM tabelleXY
Day ist ja nun eine Funktion, und so sieht ja nun kein Funktionsaufruf auf. Wie sieht es denn aus, wenn du es machst wie oben schon gepostet?

user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:

SQL-Anweisung
1:
2:
SELECT *, CASE WHEN DAY([Datum]) > 30 THEN 'gross' ELSE 'klein' END
FROM tabelleXY;
LG


Nordstern - So 05.12.10 20:05

Hallo,

Danke für die schnelle Antwort. Leider gleicher Fehler. Die eckigen Klammer hat VS selbständig eingefügt, deshalb ist es mir zuerst nicht aufgefallen.
Das es aber daran nicht liegt, habe ich es mit folgenden Test versucht. (einfach ein anderes Feld benutzt, Text statt Datum)

SELECT *, CASE WHEN von = 'XXX' Then 'gross' ELSE 'klein' END
FROM tabelleXY

mfg Steffen


stendate - Do 23.12.10 00:11

user profile iconNordstern hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
SELECT *, CASE WHEN von = 'XXX' Then 'gross' ELSE 'klein' END
FROM tabelleXY


CASE WHEN ist, wie oben schon erwähnt T-SQL, damit kann die JET-Engine nix anfangen.

Was definitiv geht ist über OLEDB den IIF-Ausdruck zu verwenden, aber nicht im DataSet-Designer sondern im Source als String, nicht so schön aber praktikabel. Das geht auf alle Fälle und muss bei Migration auf SQL-Server eben auf CASE WHEN umgeschrieben werden.

Bei Format() bin ich mir gerade nicht sicher, ich glaube das geht nicht, mit etwas Glück läuft es wenn du das im Jet-Backend als View speicherst und dann das View anstatt der Tabelle im DataSet-Designer ansprichst.