代码之家  ›  专栏  ›  技术社区  ›  SherlockSpreadsheets

“RETURNS”附近的语法不正确。应为AS、FOR或WITH。”(SQL用户定义函数)[已关闭]

  •  -1
  • SherlockSpreadsheets  · 技术社区  · 6 年前

    请查看下面的SQL代码,了解我正在尝试创建的用户定义函数。在SSMS中,这部分代码似乎存在问题:

     RETURNS VARCHAR(50)
    

    我收到错误消息:

    “RETURNS”附近的语法不正确。期待作为、为或与。

    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 回复  |  直到 6 年前
        1
  •  2
  •   Gaurav    6 年前

    我认为您混淆了存储过程和函数。您可以使用输出变量从存储过程返回数据,也可以使用返回代码。返回代码将只返回通常用作状态代码的整数值。在代码中,看起来您希望使用函数而不是存储过程。

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

        2
  •  0
  •   elizabk    6 年前

    在存储过程中 RETURN 语句用于立即退出,并且只能(可选)返回表示状态代码的整数表达式。如果未指定整数,则返回值0(成功)。要返回varchar(50)值,您的选项如下

    1. FUNCTION 返回单个值。
    2. 存储过程可以使用 OUT 关键词如下:

      CREATE PROCEDURE [dbo].[udfGetKillContractTreatmentMostSevere] (@paramContractCode INT, @GetMostSevereTreatment VARCHAR(50) OUT) 
      

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