我有一个名为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
我做错了什么?
答案 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值','转换为数据类型时转换失败 中间体