Скалярная функция SQL, как не использовать оператор выбора - PullRequest
5 голосов
/ 16 декабря 2011

Я строю свою первую скалярную функцию (MS SQL Server) и получаю такую ​​ошибку:

"Операторы выбора, включенные в функцию, не могут возвращать данные клиенту."

IЯ понимаю, что я не могу использовать операторы выбора, но как мне тогда получить информацию?

Функция показывает, изучал ли студент и прошел ли он элементарные предметы, и работает следующим образом:

идентификатор параметра - это общий идентификатор, который дает мне студента из таблицы «Студенты».Затем из таблицы «Предметы» я получаю вид предмета.Функция getKindOfSubjectStudied с заданным параметром kindOfSubject покажет, является ли предмет, переданный студентом, элементарным.Если это так, то результат будет равен 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

1 Ответ

5 голосов
/ 16 декабря 2011

Просто измените эту строку:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...