Pourquoi est-ce que j'obtiens cette erreur en essayant d'imiter la concat de groupe dans SQL Server?

J'ai une table appelée Students et une autre appelée Enrollment . Je veux get les dossiers d'un étudiant particulier et les cours auxquels ils sont inscrits.

J'ai travaillé avec la fonction MySQL GROUP_CONCAT qui n'est apparemment pas disponible dans SQL Server, ce que je suis en train de faire en ce moment. Lorsque j'exécute ma procédure stockée, j'obtiens une erreur

La conversion a échoué lors de la conversion de la valeur varchar ',' en type de données int.

Pourquoi je reçois ça? Je donne à la procédure stockée une valeur de 1 lorsque je l'exécute dans SQL Server Management Studio.

Voici ma procédure stockée:

 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 

Qu'est-ce que je fais mal?

C'est parce que vous avez des types de données incompatibles. courseId ici est INT , donc si vous voulez append un , avant, vous devez d'abord le convertir en 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 

Pour l'expliquer plus en détail, puisque vous avez:

 ',' + e.courseId 

SQL Server essaie de convertir les deux valeurs dans le type de données avec une priorité supérieure. Et puisque INT a une priorité de type de données plus élevée que VARCHAR , il essaye de convertir ',' en INT , ce qui provoque l'erreur:

La conversion a échoué lors de la conversion de la valeur varchar ',' en type de données int.