使用"和"创建函数创建功能

时间:2015-04-27 07:07:50

标签: sql-server sql-server-2008 function

我正在尝试创建此函数(变量名称已更改,因此允许命名错误,因为测试原始时没有函数正常工作),

 CREATE FUNCTION [dbo].[GetQuality](@FruitID VARCHAR(200))
RETURNS varchar(200)
AS
BEGIN
DECLARE @Result varchar(200)

SET @Result = (

WITH 
latest AS
(
    SELECT * FROM (SELECT TOP 1 * FROM Fruits_Crate WHERE FruitID like @FruitID ORDER BY ExpiryDate DESC) a
), 
result AS
(
    SELECT 
        latest.ExpiryDate as LatestExpiryDate, latest.Size as LatestSize, latest.Weight as LatestWeight,
        previous.ExpiryDate as PreviousExpiryDate, previous.Size as PreviousSize, previous.Weight as PreviousWeight,
        CASE SIGN((latest.Weight * latest.Size) - (previous.Weight * previous.Size))
            WHEN 1 THEN 'Increased'
            WHEN 0 THEN 'Static'
            WHEN -1 THEN 'Decreased'
            ELSE 'No Previous Data'
        END AS Movement 
    FROM (SELECT TOP 1 * FROM (SELECT TOP 2 * FROM Fruits_Crate WHERE FruitID like @FruitID ORDER BY ExpiryDate DESC) x  ORDER BY ExpiryDate) previous
    FULL OUTER JOIN latest ON previous.FruitID = latest.FruitID
)

SELECT result.Movement AS FruitMovement from result;
)

RETURN @Result

END

错误

  

Msg 156,Level 15,State 1,Procedure GetQuality,Line 10   关键字' WITH'附近的语法不正确。

     

Msg 319,Level 15,State 1,Procedure GetQuality,Line 10   关键字'与'附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句。

     

Msg 102,Level 15,State 1,Procedure GetQuality,Line 14   ','附近的语法不正确。消息102,级别15,状态1,过程GetQuality,第31行语法不正确')'。

1 个答案:

答案 0 :(得分:4)

我认为你可以移动任务,并在with之前放一个半冒号,一切都应该是好的。

CREATE FUNCTION [dbo].[GetQuality](@FruitID VARCHAR(200))
RETURNS varchar(200)
AS
BEGIN
DECLARE @Result varchar(200);

WITH 
latest AS
(
    SELECT * FROM (SELECT TOP 1 * FROM Fruits_Crate WHERE FruitID like @FruitID ORDER BY ExpiryDate DESC) a
), 
result AS
(
    SELECT 
        latest.ExpiryDate as LatestExpiryDate, latest.Size as LatestSize, latest.Weight as LatestWeight,
        previous.ExpiryDate as PreviousExpiryDate, previous.Size as PreviousSize, previous.Weight as PreviousWeight,
        CASE SIGN((latest.Weight * latest.Size) - (previous.Weight * previous.Size))
            WHEN 1 THEN 'Increased'
            WHEN 0 THEN 'Static'
            WHEN -1 THEN 'Decreased'
            ELSE 'No Previous Data'
        END AS Movement 
    FROM (SELECT TOP 1 * FROM (SELECT TOP 2 * FROM Fruits_Crate WHERE FruitID like @FruitID ORDER BY ExpiryDate DESC) x  ORDER BY ExpiryDate) previous
    FULL OUTER JOIN latest ON previous.FruitID = latest.FruitID
)

SELECT @RESULT = result.Movement AS FruitMovement from result;


RETURN @Result

END