SQL标量函数,如何不使用select语句

use*_*417 5 sql sql-server select function

我正在构建我的第一个标量函数(MS SQL Server),我收到此错误:

"函数中包含的Select语句无法将数据返回给客户端."

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

该功能显示学生是否已经学习并通过了基础科目,并以这种方式工作:

参数id是一个通用id,它给我表student的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
Run Code Online (Sandbox Code Playgroud)

Yuc*_*uck 5

只需改变这一行:

SELECT    'Return Value' = @return_value
Run Code Online (Sandbox Code Playgroud)

RETURN @return_value;
Run Code Online (Sandbox Code Playgroud)

您还必须修改该变量的定义,int如下所示:

DECLARE @return_value int;
Run Code Online (Sandbox Code Playgroud)

或者将函数的返回值更改为varchar(50):

CREATE FUNCTION [dbo].[getStudentHasElementary] 
( 
    -- paramenter
    @id int
)
RETURNS varchar(50)
Run Code Online (Sandbox Code Playgroud)

您必须清理两个查询.尝试声明@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);
Run Code Online (Sandbox Code Playgroud)