“'RETURNS'附近的语法不正确。应为AS,FOR或WITH。” (SQL用户定义函数)

时间:2018-12-24 17:46:15

标签: sql sql-server

请查看下面的SQL代码,以获取我要创建的用户定义函数。在SSMS中,这部分代码似乎存在问题:

 RETURNS VARCHAR(50)

我收到错误消息:

  

“ RETURNS”附近的语法不正确。期望为AS,FOR或WITH。

SQL:

CREATE PROCEDURE [dbo].[udfGetKillContractTreatmentMostSevere] 
    (@paramContractCode NUMBER(5,0))
RETURNS VARCHAR(50)
AS
BEGIN
    --Return the value into this variable
    DECLARE @GetMostSevereTreatement VARCHAR(50)

    --Severity Table stores the logic for evaluating the severity of the medice
    DECLARE @lkpTreatmentSeverity AS TABLE (MedicineType VARCHAR(2), Severity INT)

    INSERT INTO @lkpTreatmentSeverity 
    VALUES (NULL, 0), ('NAE', 1), ('NAIHM', 2), ('CONVEN', 3), ('UNKNOWN', 4)

    --Query to return the most severe medicine for the contract
    ;
    WITH cteKillTreatment AS 
    (
        SELECT --*
            ks.PLANT_CODE,
            KS.KILL_DATE,
            KS.KILL_ORDER_NBR,
            c.CONTRACT_CODE,
            t.MEDICINE_TYPE,
            ISNULL(t.MEDICINE_TYPE, 'No Treatments') AS 'MedicineType',
            lkpTS.Severity
        FROM
            KILL_SCHEDULE ks
        INNER JOIN 
            contract c ON  ks.CONTRACT_CODE = c.CONTRACT_CODE
        LEFT OUTER JOIN 
            cont_disease cd ON  c.CONTRACT_CODE = cd.CONTRACT_CODE
        LEFT OUTER JOIN 
            treatment t ON  cd.TREATMENT_CODE = t.TREATMENT_CODE
        LEFT OUTER JOIN 
            @lkpTreatmentSeverity lkpTS ON  t.MEDICINE_TYPE = lkpTS.MedicineType
    )
    --Kill Schedule Treatment (1 record only; most severe medicine).
    SELECT
        @GetMostSevereTreatement = 
            CONCAT(cteKT.Severity, ': ', cteKT.MedicineType)  
        --    cteKT.*
        --    , subKT.CountMeds
        --    , subKT.CountDistinctMeds
    FROM
        cteKillTreatment cteKT
    INNER JOIN
        (SELECT TOP 1 
             cte.PLANT_CODE,
             cte.KILL_DATE,
             cte.KILL_ORDER_NBR, 
             cte.CONTRACT_CODE,
             COUNT(*) CountMeds,
             COUNT(DISTINCT cte.MEDICINE_TYPE) AS CountDistinctMeds,
             MAX(cte.Severity) as TreatementMostSevere
         FROM
             cteKillTreatment cte
         GROUP BY
             cte.PLANT_CODE, cte.KILL_DATE, cte.KILL_ORDER_NBR, cte.CONTRACT_CODE
         HAVING
             MAX(cte.Severity) = cte.Severity
        ) subKT ON cteKT.CONTRACT_CODE = subKT.CONTRACT_CODE
                AND cteKT.KILL_DATE = subKT.KILL_DATE
                AND cteKT.KILL_ORDER_NBR = subKT.KILL_ORDER_NBR
    WHERE 
        cteKT.CONTRACT_CODE = @paramContractCode

    RETURN @GetMostSevereTreatement
END
GO
;

2 个答案:

答案 0 :(得分:2)

我认为您正在混淆存储过程和函数。您可以使用输出变量从存储过程返回数据,也可以使用返回码。该返回码将仅返回通常用作状态码的整数值。在您的代码中,您似乎想使用Function而不是存储的proc。

请阅读以下内容以更好地理解-

https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/return-data-from-a-stored-procedure?view=sql-server-2017

答案 1 :(得分:0)

在存储过程中, var myVar; function display() { myVar = setTimeout(alertFunc, 1000); } function alertFunc() { document.getElementById('random').innerText = rand; } 语句用于立即退出,并且只能(可选)返回表示状态码的整数表达式。如果未指定整数,则返回值0(成功)。要返回varchar(50)值,您可以选择

  1. 您都可以使用返回单个值的标量RETURN
  2. 存储过程可以设置使用FUNCTION关键字在参数列表中声明的输出参数,如下所示:

    OUT

然后,您可以简单地设置out参数的值,它将从存储过程中返回。请注意,存储过程可以具有多个out参数。