为什么我在尝试模仿SQL Server中的组连接时出现此错误?

Sho*_*291 2 sql-server

我有一张叫做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)

我究竟做错了什么?

Fel*_*tan 5

这是因为您的数据类型不匹配.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时转换失败.