2014-01-20 5 views
-1

Я пытался создать функцию, которая возвращает целое число. Однако я получил предупреждение какСоздать функцию return integer SQL Server 2008

"Msg 2715, Level 16, State 3, Procedure median, Line 1 
Column, parameter, or variable #0: Cannot find data type Median." 

Вот запрос. Заранее спасибо.

CREATE FUNCTION dbo.median (@score int) 
RETURNS Median 
AS 
BEGIN 
DECLARE @MedianScore as Median; 
SELECT @MedianScore= 
(
(SELECT MAX(@score) FROM 
    (SELECT TOP 50 PERCENT Score FROM t ORDER BY Score) AS BottomHalf) 
+ 
(SELECT MIN(@score) FROM 
    (SELECT TOP 50 PERCENT Score FROM t ORDER BY Score DESC) AS TopHalf) 
)/2 ; 
RETURN @MedianScore; 
END; 
GO 
+2

'ВОЗВРАЩАЕТСЯ Median' &' DECLARE @MedianScore, как медиана, 'казалось бы, проблема. Попробуйте изменить их оба на другой тип данных. – AeroX

+2

Сообщение об ошибке очень явное. Вы действительно это прочитали? Следовательно, нисходящий. –

+0

Что означает «Уровень 16, состояние 3, медиана процедуры» - это уровень 16, такой же, как и строка 16? просто любопытно – Coffee

ответ

3

Просто измените тип возвращаемого значения в целое:

CREATE FUNCTION dbo.median (@score int) 
RETURNS integer 
AS 
BEGIN 
DECLARE @MedianScore as integer; 

Если вы не намеренно используя Median типа за то, что вы еще не говорилось.

0

Вы должны объявить тип данных на RETURNS. «Медиана» - это не тип.

CREATE FUNCTION dbo.median (@score int) 
RETURNS real -- you can use also float(24), numeric(8,3), decimal(8,3)... 
AS 
BEGIN 
DECLARE @MedianScore as real; 
SELECT @MedianScore= 
(
(SELECT MAX(@score) FROM 
    (SELECT TOP 50 PERCENT Score FROM t ORDER BY Score) AS BottomHalf) 
+ 
(SELECT MIN(@score) FROM 
    (SELECT TOP 50 PERCENT Score FROM t ORDER BY Score DESC) AS TopHalf) 
)/2 ; 
RETURN @MedianScore; 
END; 
GO 
0

Так как вы вычисления медианы некоторых значений Я хотел бы предложить вам возвращают числовое значение вместо Integer, как MAX (@score) + MIN (@score)/2 может возвращать значение десятичного числа. поэтому попытка сохранить это значение в переменной INT приведет к усечению десятичной части. что может привести к неправильным результатам.

В следующем примере я использовал возвращаемое значение NUMERIC (20,2).

CREATE FUNCTION dbo.median (@score int) 
RETURNS NUMERIC(20,2) 
AS 
BEGIN 
DECLARE @MedianScore as NUMERIC(20,2); 
SELECT @MedianScore= 
(
(SELECT MAX(@score) FROM 
    (SELECT TOP 50 PERCENT Score FROM t ORDER BY Score) AS BottomHalf) 
+ 
(SELECT MIN(@score) FROM 
    (SELECT TOP 50 PERCENT Score FROM t ORDER BY Score DESC) AS TopHalf) 
)/2 ; 
RETURN @MedianScore; 
END; 
GO 

или если вы хотите вернуть использовать целочисленные круглую функцию внутри функции что-то вроде этого ..

CREATE FUNCTION dbo.median (@score int) 
RETURNS INT 
AS 
BEGIN 
DECLARE @MedianScore as INT; 
SELECT @MedianScore=ROUND(
(
(SELECT MAX(@score) FROM 
    (SELECT TOP 50 PERCENT Score FROM t ORDER BY Score) AS BottomHalf) 
+ 
(SELECT MIN(@score) FROM 
    (SELECT TOP 50 PERCENT Score FROM t ORDER BY Score DESC) AS TopHalf) 
)/2, 0) ; 
RETURN @MedianScore; 
END; 
GO 
Смежные вопросы