Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在外部应用块中执行存储过程_Sql_Sql Server 2008_Stored Procedures_Apply_Outer Join - Fatal编程技术网

Sql 在外部应用块中执行存储过程

Sql 在外部应用块中执行存储过程,sql,sql-server-2008,stored-procedures,apply,outer-join,Sql,Sql Server 2008,Stored Procedures,Apply,Outer Join,为什么我不能在OUTER APPLY块中使用存储过程? 我需要从存储过程dbo.GetTeacherId中获取int值,并在WHERE子句中使用它。这是我的代码: USE [StudentsDb] DECLARE @teacherIdOut int; SELECT StudentLastName, StudentFirstName, StudentMiddleName, LessonName, Score, TLastName, TFirstName, TMiddleName FROM

为什么我不能在
OUTER APPLY
块中使用存储过程? 我需要从存储过程
dbo.GetTeacherId
中获取int值,并在
WHERE
子句中使用它。这是我的代码:

USE [StudentsDb]

DECLARE @teacherIdOut int;

SELECT   StudentLastName, StudentFirstName, StudentMiddleName, LessonName, Score, TLastName, TFirstName, TMiddleName
FROM     Scores
JOIN Students
ON Scores.StudentId=Students.StudentId
JOIN Lessons
ON Scores.LessonId=Lessons.LessonId
OUTER APPLY
(
    EXECUTE dbo.GetTeacherId 0, 0, @teacherId=@teacherIdOut -- here I get error
    SELECT Teachers.TeacherLastName, Teachers.TeacherFirstName, Teachers.TeacherMiddleName
    FROM Teachers
    WHERE Teachers.TeacherId=@teacherIdOut
)T(TLastName, TFirstName, TMiddleName)
WHERE Score <=3

存储过程并不是为这种用途而设计的,因为它可以执行除选择数据之外的其他操作,它可以在不返回数据的情况下工作,也可以在不同的场景中返回不同的集合

与存储过程不同,函数完全适合与其他查询内联使用

您有两个选择:

A) 创建一个只返回
教师ID的标量函数,并将其用于
中的WHERE

CREATE FUNCTION udfGetTeacherID
(
    @lessonId int, @groupId int
)
RETURNS int
AS
BEGIN

    DECLARE @teacherId INT;

    SELECT @teacherId = GroupTeachers.TeacherId
    FROM GroupTeachers
    WHERE GroupTeachers.LessonId=@lessonId AND GroupTeachers.GroupId=@groupId;


    RETURN @teacherId;

END
GO
B) 创建表值函数,该函数可以获取所需的所有数据,并且可以对其进行联接(应用)

以下是一些阅读:

您应该使用函数来实现这种功能。@NenadZivkovic非常感谢您!有了这个功能,一切正常!我如何确认你的答案是我接受的答案?我会在几分钟后写一个更详细的解释作为答案,这样你就可以接受它,并为其他遇到这个问题的人提供帮助。如果你没有在服务器上创建函数的权限(但你有创建过程的权限),还有其他选择吗?
CREATE FUNCTION udfGetTeacherID
(
    @lessonId int, @groupId int
)
RETURNS int
AS
BEGIN

    DECLARE @teacherId INT;

    SELECT @teacherId = GroupTeachers.TeacherId
    FROM GroupTeachers
    WHERE GroupTeachers.LessonId=@lessonId AND GroupTeachers.GroupId=@groupId;


    RETURN @teacherId;

END
GO
CREATE FUNCTION udfGetTeacherName
(
    @lessonId int, @groupId int
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT t.TeacherLastName, t.TeacherFirstName, t.TeacherMiddleName
    FROM Teachers t
    INNER JOIN GroupTeachers g ON  T.TeacherID = g.TeacherID
    WHERE g.LessonId=@lessonId AND g.GroupId=@groupId
)
GO