创建函数SQL Server 2012时出错

-6 sql sql-server

我正在创建一个函数,所以我可以获取select语句的结果并将它们放在我们数据库的视图中.我运行它时,我的SELECT语句返回一个结果,但是当我去创建一个函数时,我得到错误:

Only one expression can be specified in the select list when the 
subquery is not introduced with EXISTS. 
Run Code Online (Sandbox Code Playgroud)

我仍然是新人并且学习并且会感谢我在做错的任何帮助.

CREATE FUNCTION CXi_Application 

@Application nvarchar(255), @Wave nvarchar(255)

RETURNS int
AS
BEGIN

DECLARE @Return int


SET @Return = 
(SELECT @Application, (
(sum(CASE WHEN overall_score IN (1) THEN 1 ELSE 0 END) + sum(CASE WHEN effective_score IN (1) THEN 1 ELSE 0 END) + sum(CASE WHEN easeuse_score IN (1) THEN 1 ELSE 0 END)) + 
(sum(CASE WHEN overall_score IN (2) THEN 2 ELSE 0 END) + sum(CASE WHEN effective_score IN (2) THEN 2 ELSE 0 END) + sum(CASE WHEN easeuse_score IN (2) THEN 2 ELSE 0 END)) + 
(sum(CASE WHEN overall_score IN (3) THEN 3 ELSE 0 END) + sum(CASE WHEN effective_score IN (3) THEN 3 ELSE 0 END) + sum(CASE WHEN easeuse_score IN (3) THEN 3 ELSE 0 END)) + 
(sum(CASE WHEN overall_score IN (4) THEN 4 ELSE 0 END) + sum(CASE WHEN effective_score IN (4) THEN 4 ELSE 0 END) + sum(CASE WHEN easeuse_score IN (4) THEN 4 ELSE 0 END)) + 
(sum(CASE WHEN overall_score IN (5) THEN 5 ELSE 0 END) + sum(CASE WHEN effective_score IN (5) THEN 5 ELSE 0 END) + sum(CASE WHEN easeuse_score IN (5) THEN 5 ELSE 0 END)))/
(count(overall_score) + count(effective_score) + count(easeuse_score) * 1.00 )
FROM FY14_DataMerge
WHERE [Status] = 'Completed' AND [Application] = @Application AND [Wave] = @Wave);

-- Return the result of the function
RETURN @Return

END
GO
Run Code Online (Sandbox Code Playgroud)

swa*_*eck 7

您已在DDL中指定您希望该函数返回一个 INT

RETURNS int
Run Code Online (Sandbox Code Playgroud)

但是,您的结果集包括@Application和计算本身.基本上,您已声明您正在创建标量值函数,但您的代码正在尝试返回表值结果.首先,您需要确定您想要实际执行的操作.

如果您返回单个结果(通常在SELECT调用语句的部分中找到),那么您可能正在寻找标量值函数,并且您需要@ApplicationSELECT函数DDL中的语句中删除调用.

如果您确实想要从函数返回的值,那么您将需要一个表值函数.此外,这是一个非常简单的查询,因此您可以将其设置为具有明确性能优势的内联TVF ,但我不确定它们在您的情况下将如何实现.

以下是制作内联TVF的样子:

CREATE FUNCTION CXi_Application 

@Application nvarchar(255), @Wave nvarchar(255)

RETURNS TABLE
AS
RETURN SELECT @Application as [Application], (
(sum(CASE overall_score WHEN 1 THEN 1 ELSE 0 END) 
    + sum(CASE effective_score WHEN 1 THEN 1 ELSE 0 END) 
    + sum(CASE easeuse_score WHEN 1 THEN 1 ELSE 0 END)) 
    + 
(sum(CASE overall_score WHEN 2 THEN 2 ELSE 0 END) 
    + sum(CASE effective_score WHEN 2 THEN 2 ELSE 0 END) 
    + sum(CASE easeuse_score WHEN 2 THEN 2 ELSE 0 END)) 
    + 
(sum(CASE overall_score WHEN 3 THEN 3 ELSE 0 END) 
    + sum(CASE effective_score WHEN 3  THEN 3 ELSE 0 END) 
    + sum(CASE easeuse_score WHEN 3 THEN 3 ELSE 0 END)) 
    + 
(sum(CASE overall_score WHEN 4 THEN 4 ELSE 0 END) 
    + sum(CASE effective_score WHEN 4 THEN 4 ELSE 0 END) 
    + sum(CASE easeuse_score WHEN 4 THEN 4 ELSE 0 END)) 
    + 
(sum(CASE overall_score WHEN 5 THEN 5 ELSE 0 END) 
    + sum(CASE effective_score WHEN 5 THEN 5 ELSE 0 END) 
    + sum(CASE easeuse_score WHEN 5 THEN 5 ELSE 0 END))) 
/
(count(overall_score) + count(effective_score) 
    + count(easeuse_score) * 1.00 ) as CalcMetric
FROM FY14_DataMerge
WHERE [Status] = 'Completed' AND [Application] = @Application AND [Wave] = @Wave;
GO
Run Code Online (Sandbox Code Playgroud)

但是,如果5是每个数据点的最大值,那么为什么不重构为:

CREATE FUNCTION CXi_Application 

@Application nvarchar(255), @Wave nvarchar(255)

RETURNS TABLE
AS
RETURN 
    SELECT @Application as [Application], 
        (SUM(overall_score) + SUM(effective_score) + SUM(easeuse_score))
          / 
        (count(overall_score) + count(effective_score) 
           + count(easeuse_score) * 1.00 )
        FROM FY14_DataMerge
        WHERE [Status] = 'Completed' 
           AND [Application] = @Application 
           AND [Wave] = @Wave;
GO
Run Code Online (Sandbox Code Playgroud)