2014-01-20 35 views
-1

我试图创建一个返回到整数的函数。不过,我得到了警告,因为创建函数返回整数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

'RETURNS Median'&'DECLARE @MedianScore为中位数;'似乎是问题。尝试将它们更改为不同的数据类型。 – AeroX

+2

错误消息非常明确。你真的读过吗?因此downvote。 –

+0

“Level 16,State 3,Procedure median'是什么意思? - 与第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

既然你计算一些数值的中值,我建议你返回一个数字值,而不是整数作为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 

,或者如果你想返回函数像这样内部的INTEGER使用功能全面..

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