Si d'Autre Si Dans une Fonction Sql Server
J'ai cette fonction, je suis en train de créer. Quand je l'analyser, il fonctionne très bien, mais pour créer de la fonction dans la base de données il me dit que mon noms de colonnes ne sont pas valides. Ce n'est pas vrai, j'ai orthographié correctement. Voici le code:
ALTER FUNCTION [dbo].[fnTally] (@SchoolId nvarchar(50))
RETURNS int
AS
BEGIN
DECLARE @Final nvarchar
IF EXISTS (
SELECT
question,
yes_ans,
no_ans,
na_ans,
blank_ans
FROM dbo.qrc_maintally
WHERE school_id = @SchoolId
)
IF yes_ans > no_ans AND yes_ans > na_ans
BEGIN
SET @Final = 'Yes'
END
ELSE IF no_ans > yes_ans AND no_ans > na_ans
BEGIN
SET @Final = 'No'
END
ELSE IF na_ans > yes_ans AND na_ans > no_ans
BEGIN
SET @Final = 'N/A'
END
RETURN @Final
END
Est
actualiser, je l'ai fait il y a quelques minutes.
Il n'y a pas de PK dans ce tableau, mais oui, il pourrait être utilisé comme un. Et les valeurs de yes_ans, no_ans, etc sont des entiers, donc je suis en train de comparer chaque ligne par schoolId et qui a la plus grande valeur, alors la sortie de valeur finale.
Eh bien, si plus de 1 ligne correspond à la ligne qui devrait être utilisé dans le calcul? Aussi pourquoi votre fonction déclarée en tant que
Si plus d'une ligne correspond alors à un autre examen sera effectué sur notre site et que l'examinateur, un disjoncteur.
school_id
le PK sur cette table? c'est à dire peut-il y jamais être plus qu'une ligne correspondante?actualiser, je l'ai fait il y a quelques minutes.
Il n'y a pas de PK dans ce tableau, mais oui, il pourrait être utilisé comme un. Et les valeurs de yes_ans, no_ans, etc sont des entiers, donc je suis en train de comparer chaque ligne par schoolId et qui a la plus grande valeur, alors la sortie de valeur finale.
Eh bien, si plus de 1 ligne correspond à la ligne qui devrait être utilisé dans le calcul? Aussi pourquoi votre fonction déclarée en tant que
RETURNS int
quand il retourne en fait varchar
? Vous devez aussi déclarer une longueur pour tous vos variables de type varchar. par exemple, DECLARE @Final VARCHAR(3)
Si plus d'une ligne correspond alors à un autre examen sera effectué sur notre site et que l'examinateur, un disjoncteur.
OriginalL'auteur salim | 2011-02-17
Vous devez vous connecter pour publier un commentaire.
Comme vous pouvez le voir, cela simplifie le code beaucoup. Il a également fait d'autres erreurs dans votre code plus évident: vous êtes de retour d'une nvarchar, mais a déclaré la fonction pour retourner un int (corrigé dans le code ci-dessus).
DECLARE @Final nvarchar
besoin d'une longueur ou être tronquée à 1 caractère.copié qu'à partir de la question d'origine. Je ne peux pas mettre une longueur jusqu'à l'OP nous dit qu'il doit être.
devrait fonctionner correctement avec les littéraux de chaîne dans le code.
Coehoom: Martin droite. Mais il y a un autre problème aussi. Vous êtes de retour d'une
nvarchar
tandis que la fonction est déclarée pour retournerint
.ok, tu m'as eu, mais pour ma défense je ne pense pas qu'il a besoin de déclarer une variable de retour à tous (mis à jour ma réponse à refléter cette).
OriginalL'auteur Joel Coehoorn
Vous aurez besoin pour créer des variables locales pour ces colonnes, de les affecter au cours de la sélectionner et de les utiliser pour vos tests conditionnels.
En supposant bien sûr que d'une seule ligne peut correspondre à l'état.
vous avez besoin que pour les variables ici, trop
D'accord.
Le commentaire était vraiment sur le degré de "droit trackness" pas spécialement quelque chose à voir avec le CAS de la déclaration. L'OP dit plusieurs lignes peuvent être retournés pour un
schoolid
mais je suis toujours un peu perplexe par leur explication donc +1.OriginalL'auteur Joe Stefanelli
Personne ne semble avoir repris que si (oui=non)>na ou (n=na)>oui ou (na=oui)>non, vous obtenez la valeur NULL comme résultat. Ne crois pas que c'est ce que vous êtes après.
Voici aussi une forme plus condensée de la fonction, qui fonctionne même si tout de oui, non ou na_ans est NULL.
+1 aussi pour l'aide
top 1
de garantie valide udf résultat.Cela fonctionne comme une requête select, mais pas dans le code derrière comme une fonction, n'est-ce pas cracher sur rien en retour
Une variable doit toujours être déclarée pour la réception du résultat de la requête et pour être repoussés comme le résultat de la fonction.
Je n'avais pas et j'ai maintenant. Évidemment, je me suis trompé, désolé. Il y a sans doute, la situation était similaire dans un contexte différent où il était obligatoire d'utiliser une variable (ou au moins, il était impossible de tirer la conséquence d'une sous-requête directement), et j'ai réussi à le confondre avec
RETURN
. Ne peut pas se souvenir de ce qu'il était, cependant.OriginalL'auteur RichardTheKiwi
Vous utilisez les noms de colonne dans une déclaration (en dehors d'une requête). Si vous voulez des variables, vous devez les déclarer et de les affecter.
OriginalL'auteur Amy B
Je pense que vous seriez mieux avec une instruction du CAS, qui fonctionne beaucoup plus comme if/ELSEIF
Plus d'infos: http://technet.microsoft.com/en-us/library/ms181765.aspx
OriginalL'auteur mpickens
Regardez ces lignes:
Si yes_ans > no_ans et yes_ans > na_ans
et similaires. Pour ce faire, "yes_ans" etc. reportez-vous? Vous n'êtes pas à l'aide de ces dans le contexte d'une requête; le "si" condition de ne pas s'étendre à la colonne des noms que vous utilisez à l'intérieur.
Envisager l'affectation de ces valeurs à des variables que vous pouvez ensuite utiliser pour votre conditionnelle de flux ci-dessous. Ainsi,
fin
Le type de retour est également incompatibles avec la déclaration. Il serait d'une grande aide si vous en retrait, a utilisé la norme ANSI signes de ponctuation (mettre fin à des déclarations par des points-virgules), et laissé de côté le superflu de commencer/vous n'avez pas besoin de ces mono pour les lignes d'instruction exécutée en tant que résultat d'un test.
OriginalL'auteur pelazem