【问题标题】:Issue creating function with a "with"使用“with”创建函数的问题
【发布时间】:2015-07-05 12:37:23
【问题描述】:

我正在尝试创建这个函数(变量名称已更改,因此允许命名错误,因为在没有函数的情况下测试原始文件可以正常工作),

 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

错误

消息 156,级别 15,状态 1,过程 GetQuality,第 10 行 关键字“WITH”附近的语法不正确。

消息 319,级别 15,状态 1,过程 GetQuality,第 10 行 关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。

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

【问题讨论】:

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


    【解决方案1】:

    我想你可以把赋值往下移,在 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
    

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2020-10-09
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多