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
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
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
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. –