在 OUTER APPLY 块中执行存储过程
Posted
技术标签:
【中文标题】在 OUTER APPLY 块中执行存储过程【英文标题】:Execute stored procedure in OUTER APPLY block 【发布时间】:2013-11-06 23:43:26 【问题描述】:为什么我不能在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
还有其他方法可以从存储过程中获取值吗?
这里是我的存储过程dbo.GetTeacherId
:
USE [StudentsDb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetTeacherId] @lessonId int, @groupId int, @teacherId int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @teacherId=GroupTeachers.TeacherId
FROM GroupTeachers
WHERE GroupTeachers.LessonId=@lessonId AND GroupTeachers.GroupId=@groupId
END
【问题讨论】:
你应该使用函数来实现这种功能。 @NenadZivkovic 非常感谢!有了这个功能,一切正常!如何确认您的答案是我接受的答案? 我会在几分钟内写一个更详细的解释作为答案,所以你可以接受它,并为其他偶然发现这个问题的人提供。 【参考方案1】:存储过程不是为这种用途而设计的,因为它可以执行除了选择数据之外的操作,它可以在不返回数据的情况下工作,或者它可以在不同的场景中返回不同的集合。
与存储过程不同,函数完全适合与其他查询内联使用。
你有两个选择:
A) 创建一个仅返回 TeacherID
的标量函数,并在您的 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) 创建表值函数,它可以为您获取所需的所有数据,您只需加入(应用)它即可。
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
这里有一些阅读: Difference between Stored Procedure and Function in SQL Server
【讨论】:
如果您没有在服务器上创建函数的权限(但您有创建过程的权限),是否有替代方案?以上是关于在 OUTER APPLY 块中执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章