请查看下面的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
;
答案 0 :(得分:2)
我认为您正在混淆存储过程和函数。您可以使用输出变量从存储过程返回数据,也可以使用返回码。该返回码将仅返回通常用作状态码的整数值。在您的代码中,您似乎想使用Function而不是存储的proc。
请阅读以下内容以更好地理解-
答案 1 :(得分:0)
在存储过程中, var myVar;
function display() {
myVar = setTimeout(alertFunc, 1000);
}
function alertFunc() {
document.getElementById('random').innerText = rand;
}
语句用于立即退出,并且只能(可选)返回表示状态码的整数表达式。如果未指定整数,则返回值0(成功)。要返回varchar(50)值,您可以选择
RETURN
。 存储过程可以设置使用FUNCTION
关键字在参数列表中声明的输出参数,如下所示:
OUT
然后,您可以简单地设置out参数的值,它将从存储过程中返回。请注意,存储过程可以具有多个out参数。