2013-12-10 1 views
-6

select 문을 결과로 가져와 데이터베이스에 저장할 수 있도록 함수를 만들었습니다. 내가 그것을 실행하면 내 SELECT 문은 하나 개의 결과를 반환하지만 내가 가서 함수를 작성하는 데에 배치 할 때 나는 오류 얻을 :함수 SQL Server 2012를 만들 때 오류가 발생했습니다.

Only one expression can be specified in the select list when the 
subquery is not introduced with EXISTS. 

난 아직도 새로운 학습이고 내가 무엇에 어떤 도움을 주셔서 감사합니다 것을 잘못하고있다. 당신이 INT

RETURNS int 

를 반환하는 기능을하고 싶습니다 당신은 DDL에서 지정한

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 
+2

을 여기

는 인라인 TVF을 좋아 보일 것 인 것이다 오류 자체 설명입니다. SELECT 문을 실행하고 출력하는 열의 수를 확인하십시오. 당신은 오직 하나만 가질 수 있습니다. – Kermit

+0

예, 이제 알 수 있습니다. 분명히 도와 주셔서 감사합니다. :) –

답변

7

그러나, 당신의 결과 집합 @Application 및 계산 자체가 포함되어 있습니다. 본질적으로, 스칼라 반환 함수를 작성 중이지만 코드에서 테이블 반환 결과를 반환하려고한다고 선언했습니다. 먼저 당신이 실제로하고 싶은 것을 결정해야합니다.

당신은 (일반적으로 전화 문의 SELECT 부분에 있음) 하나의 결과 다음 기회는 당신이 스칼라 반환 함수를 찾고 있고 당신이 당신의 SELECT 문에서 @Application 호출을 제거 할 필요를 반환하는 경우 함수 DDL.

실제로 함수에서 반환 된 값을 원한다면 테이블 반환 함수가 필요합니다. 또한 이것은 매우 간단한 쿼리이므로 definite performance benefits 인 인라인 TVF로 만들 수 있습니다. 그러나 나는 분명히 그들이 당신의 경우에 어떻게 실현 될지 확신하지 못합니다. (5) 각 데이터 포인트의 최대 값 인 경우 왜 같은 리팩토링하지,

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 

그러나 :

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 
+0

출력에 대해 '@ Application'이 별칭을 지정하지 않아야합니까? –

+0

@AndriyM 예. 우는 소리. 감사합니다 – swasheck

+0

정말 고마워요. 내가 저장 프로 시저에서 참조 용으로 만 사용했기 때문에 @Application을 제거한 결과 작동했습니다. 도와 주셔서 감사합니다. –

관련 문제