1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Abfrage mit SELECT (Unterbedingung) in WHERE

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von thomar78, 31 Juli 2017.

  1. thomar78

    thomar78 Benutzer

    Hallo, ich habe hier ein Problem mit der Erstellung einer Abfrage.
    Eigentlich erscheint mir die Bedingung sehr einfach, aber ich bekomme ständig eine Fehlermeldung, die ich mir nicht erklären kann...

    Die Tabelle hat im Grunde nur 3 Spalten

    No, YYYYMM, Value
    2116 201704 500
    2116 201705 1000
    2116 201706 1000
    2116 201707 750

    Die Abfrage gibt die No und YYYYMM als Parameter vor und liefert Value zurück. Sollte der übergebene Wert für den Parameter YYYYMM nicht gefunden werden soll der Value Wert geliefert werden, bei dem YYYYMM für No am größten ist.

    Ich habe es mit CASE WHEN in der WHERE Bedingung versucht, bekomme aber den Fehler:
    Fehlerquelle: .Net SqlClient Data Provider
    Fehlermeldung: Parameter 4 ([DBName].[].[unknown]): The CLR Type does not exist or you do not have permissions to access it.

    SELECT Value, YYYYMM
    FROM tb1
    WHERE (No = @No) AND (YYYYMM = CASE WHEN YYYYMM = @YYYYMM THEN YYYYMM ELSE
    (SELECT MAX(YYYYMM)
    FROM tb1
    WHERE No = @No) END)

    Kann mir jemand sagen, wo mein Fehler liegt, oder mir auf Grund des hier geschilderten Beispiels sagen, wie die Abfrage auszusehen hat?

    Vielen Dank vorab...
     
  2. ukulele

    ukulele Datenbank-Guru

    Ich bin mir nicht sicher, CASE habe ich im WHERE-Teil eigentlich noch nie benutzt. Es liegt entweder daran oder an den Variablen, @No und @YYYYMM existieren? Womit machst du die Abfrage und kannst du die Variablen gegen harte Werte tauschen und dann läuft es?

    Vielleicht muss auch deine Spalte aus dem Subselect einen Namen haben:
    Code:
    SELECT Value, YYYYMM
    FROM tb1
    WHERE (No = @No) AND (YYYYMM = CASE WHEN YYYYMM = @YYYYMM THEN YYYYMM ELSE
    (SELECT MAX(YYYYMM) AS YYYYMM
    FROM tb1
    WHERE No = @No) END)
     
  3. thomar78

    thomar78 Benutzer

    Hallo, danke für die Rückmeldung. Es liegt an der Variable @YYYYMM. Sobald ich hier einen harten Wert eintrage, läuft die Abfrage korrekt. Der Versuch der Spalte im Subselect einen Namen zu geben führt zum selben Fehler.
    Ist meine Denke falsch? Würde man so eine Abfrage von der Struktur anders aufbauen?
     
  4. ukulele

    ukulele Datenbank-Guru

    Wie wird denn die Variable deklariert und gesetzt? Es muss ja dann in die Richtung gehen.
     
  5. thomar78

    thomar78 Benutzer

    Hallo, das Problem war eigentlich zweigeteilt. Die Fehlermeldung kommt, egal wie ich die Variablen deklariere. Das Fenster zur Konfiguration der Datenquelle im VS2015 bringt den Fehler mit CLR Type immer. Es scheint an dem Zeichen '<' vor der @Period Variable zu liegen. Im fertigen SQLDataSource Element in der aspx Seite werden diese als '&lt;' ausgegeben. Führe ich die Testabfrage (nicht im Designer) dann aus, bekomme ich korrekte Ergebnisse mit dem folgenden SELECT:

    SELECT Value FROM tb1 WHERE (No = @No) AND (YYYYMM = (SELECT CASE WHEN EXISTS (SELECT YYYYMM FROM tb1 WHERE (No = @No) AND (YYYYMM = @Period)) THEN @Period WHEN EXISTS (SELECT MAX(YYYYMM) FROM tb1 WHERE (No = @No) AND (YYYYMM < @Period)) THEN (SELECT MAX(YYYYMM) FROM tb1 WHERE (No = @No) AND (YYYYMM < @Period)) ELSE 'einen Wert den es definitiv nicht gibt für YYYYMM' END AS Expr1))

    Das einzige Problem welches ich nun habe ist:

    gebe ich einen Wert für @Period ein für welchen es keinen Eintrag kleiner @Period gibt bekomme ich NULL zurück. Ich habe es noch nicht geschafft, dass mir dann 0 zurückgegeben wird.
    Wenn da jemand Rat weiß...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden