Sql Server Case Statement me donne des erreurs dans la fonction définie par l'utilisateur

StackOverflow https://stackoverflow.com/questions/302833

  •  08-07-2019
  •  | 
  •  

Question

Je souhaite utiliser une déclaration de casse dans mes fonctions définies par l'utilisateur car je dois faire correspondre plusieurs termes. Je pourrais utiliser une table pour les correspondances, mais je ne pourrais pas la placer dans la définition de la colonne calculée.

Ceci fonctionne avec les instructions IF:

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

Mais avec le style original utilisant un CASE ... QUAND PUIS BLOC, je reçois un message d'erreur.

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 

Je reçois une erreur Syntaxe incorrecte près de la casse et syntaxe incorrecte près de when pour mes éléments when.

J'ai tout bien mis en lot car mon dernier bloc CREATE FUNCTION se termine par le GO, et selon la documentation de CASE, j'ai la bonne syntaxe.

Je construis une fonction scalaire plus grande qui utilisera les autres fonctions scalaires pour générer le codage de production dans notre système correspondant à d'autres paramètres. Il serait préférable de pouvoir utiliser CASE car le codage de la production dépend du produit et du client.

Une erreur supplémentaire apparaît également dans le deuxième exemple de ma ligne Créer une fonction: "Syntaxe incorrecte:" Créer une fonction "doit être la seule instruction du lot", mais je ne reçois aucune information identique. " cette erreur avec les FI.

Qu'est-ce que je fais de travers ou est-ce que CASES n'est autorisé que dans les requêtes SQL plutôt que dans les fonctions scalaires? Les messages d'erreur proviennent du système de message d'erreur squiggle de SQL Server Management Studio.

Était-ce utile?

La solution

La déclaration de cas devrait ressembler à:

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

Autres conseils

Je pense que votre problème est dû au fait que vous ne spécifiez pas la taille de votre varchar (dont la valeur par défaut est 1). Il en résulte que l'entrée et la sortie sont tronquées en un seul caractère. (Il vous manquait également un @ sur votre variable à l'intérieur de la fonction.)

Ainsi, PRINT dbo.SizeExample ('16 -18 ') imprimera ' B ' (ce qui n'est pas seulement tronqué, ce n'est pas non plus la réponse souhaitée, qui est '1' )

Essayez plutôt:

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 est simplement une expression recherchée - vous ne pouvez pas RETURN - c'est un peu comme IIF () en VB ou IF () dans Excel. La réponse précédente expliquait essentiellement cela.

  2. VARCHAR signifie VARCHAR (1) , de sorte que vous obtiendrez une troncature - en d'autres termes, vous ne verrez jamais 'BAD' seulement 'B' . Je ne suis pas sûr de savoir pourquoi vous ne recevez pas d'avertissement de troncature quand cela se produit, comme si vous utilisiez SQL INSERT , mais voilà.

  3. @ms est le nom de votre variable. Je ne suis pas sûr de savoir pourquoi ms serait acceptée à moins qu'il y ait un autre objet de base de données portant ce nom (une table?) - et même dans ce cas, il ne le serait pas. Toutes les variables et tous les paramètres dans T-SQL ont comme préfixe @ comme ceci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top