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.