web-dev-qa-db-fra.com

Convertir le jeu de résultats SQL Server en chaîne

Je reçois le résultat dans SQL Server en tant que 

SELECT StudentId FROM Student WHERE condition = xyz

Je reçois la sortie comme

 StudentId 
 1236 

 7656 

 8990 .__………………………………

Le paramètre de sortie de la procédure stockée est @studentId chaîne et je souhaite que l'instruction return renvoie 

1236, 7656, 8990.

Comment puis-je convertir la sortie en une seule chaîne? 

Je retourne colonne unique [ie. Carte d'étudiant]

38
Zerotoinfinity

Testez ceci:

 DECLARE @result NVARCHAR(MAX)

 SELECT @result = STUFF(
                        (   SELECT ',' + CONVERT(NVARCHAR(20), StudentId) 
                            FROM Student 
                            WHERE condition = abc 
                            FOR xml path('')
                        )
                        , 1
                        , 1
                        , '')
40
ABI
DECLARE @result varchar(1000)

SET @result = ''

SELECT @result = @result + StudentId + ',' FROM Student WHERE condition = xyz

select substring(@result, 0, len(@result) - 1) --trim extra "," at end
56
Bonshington

Utilisez la fonction COALESCE

DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = COALESCE(@StudentID + ',', '') + StudentID
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID
8
Saloni

Les deux réponses sont valables, mais n'oubliez pas d'initialiser la valeur de la variable, par défaut, NULL et avec T-SQL:

NULL + "Any text" => NULL

C'est une erreur très commune, ne l'oubliez pas!

C'est aussi une bonne idée d'utiliser la fonction ISNULL:

SELECT @result = @result + ISNULL(StudentId + ',', '') FROM Student
7
Alex

Utilisez la fonction CONCAT pour éviter les erreurs de conversion:

DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = CONCAT(COALESCE(@StudentID + ',', ''), StudentID)
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID
1
pistol-pete

ou une seule déclaration select ...

DECLARE @results VarChar(1000)
SELECT @results = CASE
     WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
     ELSE ', ' + CONVERT( VarChar(20), [StudentId])
   END
FROM Student WHERE condition = abc;
0
brad.v

Le réponse de brad.v est incorrect! Cela ne vous donnera pas une chaîne concaténée.

Voici le code correct, presque comme brad.v mais avec un changement important:

DECLARE @results VarChar(1000)
  SELECT @results = CASE
     WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
     ELSE @results + ', ' + CONVERT( VarChar(20), [StudentId])
  END
FROM Student WHERE condition = abc;

Regarde la différence? :) brad.v corrige ta réponse, je ne peux rien faire pour la corriger ou la commenter car ma réputation ici est nulle. Je suppose que je peux enlever le mien après avoir réparé le tien. Merci!

0
Vadym Voznyuk

Celui-ci fonctionne avec les valeurs NULL dans le tableau et ne nécessite pas d'opération de sous-chaîne à la fin. COALESCE ne travaille pas vraiment bien avec les valeurs NULL dans la table (si elles seront présentes).

DECLARE @results VARCHAR(1000) = '' 
SELECT @results = @results + 
           ISNULL(CASE WHEN LEN(@results) = 0 THEN '' ELSE ',' END + [StudentId], '')
FROM Student WHERE condition = xyz

select @results
0
Gega Kakabadze