J'ai le script suivant:Serait-ce une situation appropriée pour un curseur?
SELECT left(SHI.FSOKEY, 6) AS [SoNo]
, substring(SHI.FSOKEY, 7, 3) AS [So Item]
, right(SHI.FSOKEY, 3) AS [So Rels]
, QAL.FCLOT AS [LotSerial]
FROM shmast SHM
INNER JOIN shitem SHI
ON SHM.FSHIPNO = SHI.FSHIPNO
INNER JOIN qalotc QAL
ON SHM.FSHIPNO = Left(QAL.FCUSEINDOC, 6)
AND substring(QAL.FCUSEINDOC, 7, 6) = SHI.FITEMNO
Ce produit sortie qui ressemble à ceci:
SoNo So Item SoRels LotSerial
123456 1 001 ABCD
123456 1 001 AMOH
123456 1 001 POWK
123456 1 001 IUIL
123456 1 002 ABCE
Je veux groupe par SONO, Soitem, et Sorels obtenir une liste des LotSerials pour chacun. Donc, ma sortie ressemblerait à ceci:
SoNo So Item SoRels LotSerial
123456 1 001 ABCD, AMOH, POWK, IUIL
123456 1 002 ABCE
que je dois faire pour que je puisse tirer cette information dans une requête principale sur la base des SoNo, Soitem, Sorels.
Toute aide serait grandement appréciée.
+1 Exactement ma pensée. Mais vous devriez faire attention, car lorsque le SELECT ne retournera rien, la fonction LEFT retournera l'erreur !! –
Grand point, vérification de longueur ajoutée. – cmsjr
puisque cette fonction sera exécutée pour chaque ligne retournée, vous devez la faire tourner aussi vite que possible. ma version fonctionnera beaucoup plus vite, elle n'a pas le code dont cette version a besoin pour couper la virgule. L'astuce consiste à gérer les NULL. dans mon code: _ @ cvs = ISNULL (@ cvs + ',', '') + LotSerial_ quand @cvs est nul, la virgule initiale est perdue lors de la concaténation de null + ','. cependant le ISNULL() autour de ce qui l'oblige à être une chaîne vide et à concaténer avec la première chaîne correctement. Sur toutes les concaténations suivantes, @ cvs + ',' donne une chaîne valide, ce qui vous donne des virgules si nécessaire. –