2013-12-10 2 views
-6

Я создаю функцию, поэтому я могу взять результаты своего оператора select и поместить их в виде в нашей базе данных. Мой ВЫБРАТЬ оператор возвращает один результат, когда я запускаю его, но когда я иду и поместить его, чтобы создать функцию, я получаю ошибку:Ошибка при создании функции SQL Server 2012

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

я все еще новый и обучение и был бы признателен за любую помощь в том, что я делать неправильно.

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

ошибка сам объяснение. Запустите инструкцию 'SELECT' и посмотрите, сколько столбцов она выводит. У вас может быть только один. – Kermit

+0

Да, я вижу это сейчас. Спасибо, что помогли мне с очевидным. :) –

ответ

7

Вы указали в DDL, что вы хотите функцию, чтобы вернуть INT

RETURNS int 

однако, ваш результирующий набор включает в себя @Application и сам расчет. По сути, вы заявили, что создаете Scalar-Valued Function, но вы пытаетесь вернуть результат Table-Valued. Сначала вам нужно решить, что вы хотели бы сделать на самом деле.

Если вы возвращающие один результат (обычно встречается в SELECT частях заявления вызывающего), то есть вероятность, что вы ищете функции скалярных и вам нужно удалить @Application вызова из SELECT заявления в функция DDL.

Если вы действительно хотите получить значение, возвращаемое функцией, тогда вам понадобится табличная функция. Кроме того, это довольно простой запрос, поэтому вы можете сделать его Inline TVF, который имеет definite performance benefits, хотя я не уверен, насколько четко они будут реализованы в вашем случае.

Вот что это будет выглядеть как сделать Инлайн 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 

Однако, если 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 
+0

Не должно ли '@ Application' вещь быть псевдонимом для вывода? –

+0

@AndriyM да. возгласы. спасибо – swasheck

+0

Большое вам спасибо. Я закончил удаление @Application, поскольку я использовал это только в хранимой процедуре для ссылок, и это сработало. Я ценю вашу помощь. –

Смежные вопросы