Frage

Ich möchte eine Case-Anweisung in meinem benutzerdefinierten Funktionen verwenden, weil ich auf eine Reihe von Bedingungen entsprechen müssen. Ich konnte eine Tabelle für die Spiele verwenden, aber dann würde ich nicht in der Lage sein, es in der Computed Column Definition zu setzen.

Das funktioniert mit IF-Anweisungen:

CREATE FUNCTION MaraSizeNumber
(
    @ms varchar
)
RETURNS varchar
AS
BEGIN
    IF ms = '16-18' RETURN '1'
    ELSE IF ms = '18-20' RETURN '2'
    ELSE IF ms = '20-22' RETURN '3'
    ELSE IF ms = '22+' RETURN '4'
    ELSE IF ms = '24+' RETURN '5'
    ELSE IF ms = '14-16' RETURN '7'
    ELSE RETURN 'BAD'
END

Aber mit dem ursprünglichen Stil mit einem CASE ... WENN DANN BLOCK Ich erhalte eine Fehlermeldung aus.

CREATE FUNCTION MaraSizeCaseExample
(
    @ms varchar
)
RETURNS varchar
AS
BEGIN
    CASE ms
        WHEN '16-18' THEN RETURN '1'
        WHEN '18-20' THEN RETURN '2'
        WHEN '20-22' THEN RETURN '3'
        WHEN '22+' THEN RETURN '4'
        WHEN '24+' THEN RETURN '5'
        WHEN '14-16' THEN RETURN '7'
        ELSE RETURN 'BAD'
    END
END 

Ich erhalte eine Fehlermeldung von falscher Syntax in der Nähe von Fall und falscher Syntax in der Nähe, wenn Sie meinen, wenn Teile.

Ich habe alles richtig dosierte, weil meine letzte CREATE FUNCTION Block mit dem GO endet, und entsprechend der Dokumentation auf CASE, ich habe die richtige Syntax.

Ich habe eine größere Skalarfunktion I Gebäude sind, der die anderen skalare Funktionen verwenden, um die Produktion Codierung in unserem System zu erzeugen, um andere Parameter entspricht. Es wäre am besten der Lage sein, CASE zu verwenden, da die Produktion Codierung auf dem Produkt und dem Kunden abhängig ist.

Ich habe auch einen zusätzlichen Fehler im zweiten Beispiel an meinem Create Function Zeile, die sagt: „Falsche Syntax:‚Funktion erstellen‘muss die einzige Anweisung im Batch sein“, aber mit allem, was sonst identisch verstehe ich nicht, dass Fehler mit der ifs.

Was mache ich falsch, oder Fälle sind nur in SQL-Abfragen nicht skalare Funktionen erlaubt? Die Fehlermeldungen kommen von SQL Server Management Studio Kringel Fehlermeldung System.

War es hilfreich?

Lösung

Die Case-Anweisung sollte wie folgt aussehen:

RETURN CASE @ms
       WHEN '16-18' THEN '1'
       WHEN '18-20' THEN '2'
       WHEN '20-22' THEN '3'
       WHEN '22+' THEN '4'
       WHEN '24+' THEN '5'
       WHEN '14-16' THEN '7'
       ELSE 'BAD'
  END

Andere Tipps

Ich denke, Ihr Problem ist, weil Sie nicht die Größe auf varchar angeben (die 1 angenommen wird). Dies führt zu dem Eingang und der Ausgang auf ein einziges Zeichen abgeschnitten wird. (Sie waren auch eine @ auf Ihre Variable in der Funktion fehlt.)

So PRINT dbo.SizeExample('16-18') 'B' gedruckt werden (die nicht nur abgeschnitten wird, ist es auch nicht die Antwort, die Sie wahrscheinlich wollen, die '1' ist)

Versuchen Sie stattdessen:

CREATE FUNCTION MaraSizeExample
(
    @ms varchar(5)
)
RETURNS varchar(3)
AS
BEGIN
    RETURN CASE @ms
        WHEN '16-18' THEN '1'
        WHEN '18-20' THEN '2'
        WHEN '20-22' THEN '3'
        WHEN '22+' THEN '4'
        WHEN '24+' THEN '5'
        WHEN '14-16' THEN '7'
        ELSE 'BAD'
    END
END
  1. CASE ist nur gesucht (oder Lookup) Ausdruck - man kann von innen nicht RETURN - es ist wie eine Art wie IIF() in VB oder IF() in Excel. Die frühere Antwort erklärt im Wesentlichen, dass.

  2. VARCHAR bedeutet VARCHAR(1), so dass Sie Abschneiden erhalten würde - das heißt Sie nie 'BAD' herauskommen, nur 'B' sehen würde. Ich bin mir nicht sicher, warum Sie keine Kürzungswarnung erhalten, wenn es passiert, wie Sie auf einige SQL INSERT bekommen, aber es gehen Sie.

  3. @ms ist Ihre Variablennamen. Ich bin mir nicht sicher, warum ms akzeptiert werden würde, wenn es mit diesem Namen ein anderes Datenbankobjekt ist (eine Tabelle?) - und selbst dann wäre es nicht. Alle Variablen und Parameter in T-SQL mit @ wie dies vorangestellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top