我有一张叫做Students另一张叫的桌子Enrollment.我想获得特定学生的记录以及他们注册的课程.
我使用过MySQL功能GROUP_CONCAT,这在SQL Server中显然是不可用的,这正是我现在正在使用的.当我执行我的存储过程时,我收到一个错误
将varchar值','转换为数据类型int时转换失败.
我为什么要这个?当我在SQL Server Management Studio中执行它时,我给存储过程一个值1.
这是我的存储过程:
ALTER PROCEDURE [dbo].[GetStudentDetails]
@studentID int
AS
BEGIN
SET NOCOUNT ON;
SELECT
s.studentId, s.firstName, s.lastName,
STUFF((SELECT ',' + e.courseId
FROM dbo.Enrollment as e
FOR XML PATH ('')), 1, 1, '') AS enrolledCourses
FROM dbo.Students as s
WHERE s.studentId = @studentID
END
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
这是因为您的数据类型不匹配.courseId这里是INT,所以如果你想,在它之前添加一个,你必须将它转换为VARCHAR第一个.
ALTER PROCEDURE [dbo].[GetStudentDetails]
-- Add the parameters for the stored procedure here
@studentID int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT s.studentId, s.firstName, s.lastName,
STUFF((SELECT ',' + CONVERT(VARCHAR(10), e.courseId)
FROM dbo.Enrollment as e
FOR XML PATH (''))
, 1, 1, '') AS enrolledCourses
FROM dbo.Students as s
WHERE s.studentId = @studentID
END
Run Code Online (Sandbox Code Playgroud)
为了进一步解释它,因为你有一个:
',' + e.courseId
Run Code Online (Sandbox Code Playgroud)
SQL Server尝试将两个值都转换为具有更高优先级的数据类型.而且,由于INT具有更高的数据类型优先比VARCHAR,它试图转换','到INT,然后会导致错误:
将varchar值','转换为数据类型int时转换失败.