2010-09-11 5 views
1

Je veux définir une fonction de mise à l'échelle qui dans ce que je vais retourner le résultat dans une variable, mais je ne sais pas comment faire cela.comment retourner une cellule dans une variable en fonctions sql

CREATE FUNCTION dbo.Funname (@param int) 
RETURNS INT 
AS 
declare @returnvar int 
select @returnvar = select colname from tablename where someconditions = something 
return(@returnvar) 

Je veux faire une fonction quelque chose comme le haut. Je veux dire le résultat de l'instruction select qui est:

select colname from tablename where someconditions = something 

Est-ce une seule cellule et nous sommes sûrs à ce sujet. Je veux le stocker dans une variable et le renvoyer de la fonction. Comment puis-je mettre en œuvre cette chose?

Répondre

2

Je devrais probablement mentionner que les UDF scalaires sont accompagnées d'un avertissement de santé considérable et peuvent entraîner des problèmes de performances en fonction de la façon dont vous les utilisez.

Voici cependant un exemple.

CREATE FUNCTION dbo.Funname (@param INT) 
RETURNS INT 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
RETURN (SELECT number FROM master.dbo.spt_values WHERE number < @param) 
END 

Dans l'exemple ci-dessus, je n'ai pas utilisé de variable car elle est redondante. La version avec la variable est

BEGIN 
DECLARE @Result int 
SET @Result = (SELECT number FROM master.dbo.spt_values WHERE number < @param) 
RETURN @Result 
END 

pour les deux ci-dessus vous devez être sûr que la requête a retourné au plus une ligne pour éviter une erreur lors de l'exécution. Par exemple

select dbo.Funname(-1) Retours -32768

select dbo.Funname(0) erreur de retour "sous-requête retourné plus de 1 valeur."

Une syntaxe alternative serait

BEGIN 
DECLARE @Result int 
SELECT @Result = number FROM master.dbo.spt_values WHERE number < @param 
RETURN @Result 
END 

Ce ne soulèverait plus l'erreur si la sous-requête retourné plus d'une valeur mais vous finir avec un résultat arbitraire sans avertissement - ce qui est pire.

Après les commentaires je pense que c'est ce que vous devez

CREATE FUNCTION dbo.getcustgrade(@custid CHAR(200)) 
RETURNS INT 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
     RETURN 
     (SELECT [cust grade] 
     FROM (SELECT customerid, 
         DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) AS [cust grade] 
       FROM  Orders 
       GROUP BY CustomerID 
       ) 
       d 
     WHERE customerid = @custid 
     ) 
END 
+0

je l'ai écrit cette requête en conclusion, mais il renvoie l'erreur dans la création de la funtion: CREATE FONCTION dbo.getcustgrade (@custid char (200)) INT RETOURS AVEC RETURNS NULL ON NULL ENTRÉE AS commence retour (sélectionnez Orders.CustomerID, DENSE_RANK() OVER (ORDER BY cOUNT (*) desc) [grade Cust] AS de commandes où customerid = groupe @custid par CustomerID) fin – user435245

+0

l'erreur est: Une seule expression peut être spécifiée dans la liste de sélection lorsque la sous-requête n'est pas introduite avec EXISTS. – user435245

+0

Vous ne pouvez pas renvoyer à la fois 'Orders.CustomerID' et le rang. Vous auriez juste besoin de sélectionner le rang. Cette requête ne semble pas correcte de toute façon. –

Questions connexes