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

时间:2016-05-04 02:36:38

标签: 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

我做错了什么?

1 个答案:

答案 0 :(得分: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

进一步解释,因为你有:

',' + e.courseId

SQL Server尝试将两个值都转换为具有更高优先级的数据类型。由于INT的{​​{3}}高于VARCHAR,因此会尝试将','转换为INT,然后会导致错误:

  

将varchar值','转换为数据类型时转换失败   中间体