2010-11-11 3 views
0

J'ai une procédure stockée SQL qui retourne un seul enregistrement. Cependant, dans ce proc, est une sous-requête, qui peut retourner plus d'une ligne. Je crois qu'il serait mieux de concevoir la sous-requête pour retourner une ligne de plusieurs colonnes, au lieu de plusieurs lignes.Affichage des lignes du jeu de résultats en tant que colonnes

Comment j'écrirais la sous-requête pour qu'elle renvoie des colonnes.
Actuellement, la requête est:

SET @Pkg_Status = (Select lf.name, edi.Date from EdiPackage edi, Labelfeed lf 
    Where edi.orderID = @OrderID 
    AND edi.code = lf.code 
    AND lf.labelID = 'EDIStage') 

Un échantillon de résultats de la requête ci-dessus serait:

 
Column 1    Column 2 
Field1.Value1  Field2.Value1 
Field1.Value2  Field2.Value2 
Field1.Value3  Field2.Value3 

Au lieu de cela, je voudrais que les résultats soient:

 
Column 1  | Column2  | Column3  | Column4  | Column 5  | Column 6 
Field1.Value1 | Field2.Value1 | Field1.Value2 | Field2.Value2 | Field1.Value3 | Field2.Value3 

Comment cela doit être fait?

+0

Je ne suis pas sûr qu'aucun d'entre nous comprend la question. Pouvez-vous nous montrer quelques exemples de données et la sortie désirée? – Thomas

+1

Regardez les tables tournantes dans SQL Server 2000. Recherche stackoverflow ... J'ai répondu à la question similaire –

Répondre

4

D'abord, vous devez utiliser l'ISO mot clé join lors de l'assemblage de deux tables au lieu de séparer les tables par des virgules, puis « rejoindre » eux dans la clause Where. Donc, notre requête serait:

Select LF.name, EDI.Date 
From EdiPackage As EDI 
    Join LabelFeed As LF 
     On LF.Code = EDI.Code 
Where EDI.orderID = @OrderID 
    And LF.labelID = 'EDIStage' 

Ensuite, votre exemple initial définit les résultats d'une requête sur une variable. Cela ne fonctionnera pas avec plusieurs colonnes ou lignes. Au mieux, SQL peut simplement prendre la première colonne de votre sous-requête. Enfin, ce que vous cherchez est quelque chose d'un tableau croisé. Nous aurions besoin de voir les données, mais vous pouvez obtenir ce que vous voulez en faire quelque chose comme ceci:

Select Min(Case When LF.Name = 'Value1' Then LF.Name End) As Col1 
    , Min(Case When LF.Name = 'Value1' Then EDI.Date End) As Col2 
    , Min(Case When LF.Name = 'Value2' Then LF.Name End) As Col3 
    , Min(Case When LF.Name = 'Value2' Then EDI.Date End) As Col4 
    , Min(Case When LF.Name = 'Value3' Then LF.Name End) As Col5 
    , Min(Case When LF.Name = 'Value3' Then EDI.Date End) As Col6 
From EdiPackage As EDI 
    Join LabelFeed As LF 
     On LF.Code = EDI.Code 
Where EDI.orderID = @OrderID 
    And LF.labelID = 'EDIStage' 

Dans ce cas, vous devez remplacer « valeur1 », « valeur2 » et « Value3 » avec les valeurs de données cela devrait être utilisé pour différencier une colonne d'une autre.

0

Vous devez écrire une procédure stockée qui créera une nouvelle table de mémoire dans laquelle vous pouvez ajouter dynamiquement des colonnes et chaque colonne aura une ligne différente.

0

Dans SQL 2005 et versions ultérieures, vous utiliseriez un pivot.

Si le nombre de colonnes est fixe, utilisez la réponse donnée par Thomas.

Sinon, pour les écraser dans un champ, vous feriez quelque chose comme

Declare @Pkg_Status Character Varying(8000) 
Select @Pkg_Status = 
    Coalesce(@Pkg_Status + ',' + LF.Name + ',' + Cast(EDI.Date As Character Varying), 
      LF.Name + ',' + Cast(EDI.Date As Character Varying)) 
From 
    dbo.EDIPackage As EDI 
    Inner Join dbo.LabelFeed As LF 
    On EDI.Code = LF.Code 
Where 
    (EDI.OrderID = @OrderID) 
    And (LF.LabelID = 'EDIStage') 
+0

Eh bien, le proc stocké primaire renvoie un resultset XML à un service web. D'où la nécessité de retourner le seul enregistrement. Mon environnement est toujours dans SQL 2000. – user279521

+0

Ensuite, vous feriez probablement mieux de fusionner les valeurs dans une seule colonne (avec un séparateur approprié). – Stu

+0

pouvez-vous fournir un exemple de code? – user279521

Questions connexes