2011-12-16 66 views
4

我建立我的第一个标量函数(MS SQL服务器),我得到这个错误:SQL标量函数,如何不使用select语句

“包含一个函数内不能将数据返回到客户端Select语句。 “

我明白我不能使用select语句,但是如何获取信息呢?

功能将显示,如果学生已研究并通过基本科目,并以这种方式工作:

参数ID是一个通用ID这使我从学生表的studentid。 然后,从表格主题我得到这样的主题。给定kindOfSubject参数的函数getKindOfSubjectStudied将显示学生通过的主题是否是基本的。如果是这样,结果将为1,否则将为0.

所有查询单独测试工作,没有错误。

下面是解释的功能代码。

非常感谢

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
USE MYDBASE 
GO 

CREATE FUNCTION [dbo].[getStudentHasElementary] 
( 
    -- paramenter 
    @id int 
) 
RETURNS INTEGER 
AS 
BEGIN 
    DECLARE @Result AS INTEGER 
    DECLARE @return_value varchar (50) 

SELECT studentsid 
FROM dbo.Students 
WHERE (id = id) 

SELECT kindOfSubject 
FROM dbo.Subjects 
WHERE (studentsid = studentsid) 


--- I use this function to know if the subject is elementary 
EXEC @return_value = [dbo].[getKindOfSubjectStudied] 
     @id = id, 
     @kindOfSubject = kindOfSubject; 

SELECT 'Return Value' = @return_value 



IF (@return_value = 'elementary') 
     BEGIN 
      SET @Result = 1 
     END 
     ELSE 
     BEGIN 
      SET @Result = 0 
     END 

    RETURN @Result 
END 
+0

我假设MS SQL Server? – MatBailie 2011-12-16 14:03:36

+0

这是功课吗? – Aaron 2011-12-16 14:04:52

回答

5

只是改变这一行:

SELECT 'Return Value' = @return_value 

RETURN @return_value; 

你也必须修改变量的定义,或者是int像所以:

DECLARE @return_value int; 

或改变功能的这样的返回值varchar(50)

CREATE FUNCTION [dbo].[getStudentHasElementary] 
( 
    -- paramenter 
    @id int 
) 
RETURNS varchar(50) 

你必须清理你的两个查询。尝试声明@kindofsubject变量并按此方式编写查询:

DECLARE @kindofsubject varchar(50); -- I'm guessing here...? 
-- make sure your constraints ensure only one row will be returned 
-- otherwise use TOP 1 (not a great idea, really) 
SELECT @kindofsubject = kindOfSubject 
FROM dbo.Subjects 
WHERE (studentsid = studentsid);