2010-11-09 34 views
1

J'ai une procédure stockée qui renvoie plusieurs colonnes et est très lourde de travailler avec, j'ai créé une autre procédure stockée qui convertit les lignes en colonnes. Comment puis-je insérer les colonnes de la sous-procédure dans la procédure principale?SQL insérer des colonnes d'une procédure à l'autre

Je suis pense que l'on me veux mettre les colonnes de la procédure de sous je code comme il:

(select * from subprocedure where X= 1) as subquerycolumns 

est-ce correct?

Voici ma fonction Table, mais je reçois un "Le préfixe de colonne" IPAM_RIPS_SKILL-SET_PARTICIPANT_RATING_HDR "ne correspond pas à un nom de table ou alias ..." erreur, Tout me semble bien, quelqu'un peut-il m'aider .

CREATE FUNCTION PARTICIPANTRATINGSET 
(@PARTICIPANT_ID INT) 
RETURNS TABLE 
AS 
RETURN 
    SELECT 
     ST1.SKILL_SET_ID AS SET1, SS1.SET_NAME AS NAME1, ST1.SKILL_SET_RATING AS R1, 
     ST2.SKILL_SET_ID AS SET2, SS2.SET_NAME AS NAME2, ST2.SKILL_SET_RATING AS R2, 
     ST3.SKILL_SET_ID AS SET3, SS3.SET_NAME AS NAME3, ST3.SKILL_SET_RATING AS R3, 
     ST4.SKILL_SET_ID AS SET4, SS4.SET_NAME AS NAME4, ST4.SKILL_SET_RATING AS R4, 
     ST5.SKILL_SET_ID AS SET5, ST5.SKILL_SET_OPTIONAL AS NAME5, ST5.SKILL_SET_RATING AS R5, 
     ST6.SKILL_SET_ID AS SET6, ST6.SKILL_SET_OPTIONAL AS NAME6, ST6.SKILL_SET_RATING AS R6, 
     ST7.SKILL_SET_ID AS SET7, ST7.SKILL_SET_OPTIONAL AS NAME7, ST7.SKILL_SET_RATING AS R7, 
     CM.COMMENTS 
    FROM IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_HDR HT 
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST1 
     ON HT.ID = ST1.HDR_ID and st1.SKILL_SET_ID = 1 
    INNER JOIN IPAM_RIPS_SKILL_SETS SS1 
     ON ST1.SKILL_SET_ID = SS1.ID 
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST2 
     ON HT.ID = ST2.HDR_ID and st2.SKILL_SET_ID = 2 
    INNER JOIN IPAM_RIPS_SKILL_SETS SS2 
     ON ST2.SKILL_SET_ID = SS2.ID 
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST3 
     ON HT.ID = ST3.HDR_ID and st3.SKILL_SET_ID = 3 
    INNER JOIN IPAM_RIPS_SKILL_SETS SS3 
     ON ST3.SKILL_SET_ID = SS3.ID 
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST4 
     ON HT.ID = ST4.HDR_ID and st4.SKILL_SET_ID = 4 
    INNER JOIN IPAM_RIPS_SKILL_SETS SS4 
     ON ST4.SKILL_SET_ID = SS4.ID 
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST5 
     ON HT.ID = ST5.HDR_ID and st5.SKILL_SET_ID = 5 
    INNER JOIN IPAM_RIPS_SKILL_SETS SS5 
     ON ST5.SKILL_SET_ID = SS5.ID 
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST6 
     ON HT.ID = ST6.HDR_ID and st6.SKILL_SET_ID = 10 
    INNER JOIN IPAM_RIPS_SKILL_SETS SS6 
     ON ST6.SKILL_SET_ID = SS6.ID 
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST7 
     ON HT.ID = ST7.HDR_ID and st7.SKILL_SET_ID = 11 
    INNER JOIN IPAM_RIPS_SKILL_SETS SS7 
     ON ST7.SKILL_SET_ID = SS7.ID 
    INNER JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_COMMENTS CM 
     ON HT.ID = CM.HDR_ID 
    WHERE IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_HDR.PARTICIPANT_ID = @PARTICIPANT_ID 
    GROUP BY PARTICIPANT_ID, ST1.SKILL_SET_ID, SS1.SET_NAME, ST1.SKILL_SET_RATING, ST2.SKILL_SET_ID, SS2.SET_NAME, ST2.SKILL_SET_RATING, ST3.SKILL_SET_ID, SS3.SET_NAME, ST3.SKILL_SET_RATING, ST4.SKILL_SET_ID, SS4.SET_NAME, ST4.SKILL_SET_RATING, ST5.SKILL_SET_ID, ST5.SKILL_SET_OPTIONAL, ST5.SKILL_SET_RATING, ST6.SKILL_SET_ID, ST6.SKILL_SET_OPTIONAL, ST6.SKILL_SET_RATING, ST7.SKILL_SET_ID, ST7.SKILL_SET_OPTIONAL, ST7.SKILL_SET_RATING, CM.COMMENTS 
GO 
+0

'Show uz code code'. (s'il vous plaît) – RPM1984

+1

que diable est «uz» et «codez»? Et le code est sans importance, le doit être une réponse générale sans voir le code, je suppose. – mattgcon

Répondre

0

La fonction de table ne fonctionnait pas et était à l'origine trop question. Je suis allé avec une vue à la place qui a travaillé jsut comme bon

1

vous vous ne pouvez pas utiliser les procédures de cette façon, vous devez utiliser table functions pour utiliser les résultats dans les requêtes comme une table ou une vue.

+0

vous pouvez appeler une procédure à partir d'une autre procédure, mais vous ne pouvez pas utiliser le jeu de résultats (même s'il s'agit d'une ligne) et mettre cette seule ligne résultats dans la requête de sélection existante? – mattgcon

+0

Oui, c'est la raison pour laquelle ils ont créé des fonctions de table. Notez que les procédures stockées peuvent renvoyer * plusieurs * ensembles de données, à partir des docs: "[prodecures stockées return] Un ensemble de résultats pour chaque instruction SELECT contenue dans la procédure stockée ou toute autre procédure stockée appelée par la procédure stockée." (http://msdn.microsoft.com/en-us/library/aa174792%28SQL.80%29.aspx). Je suppose que c'est l'une des raisons pour lesquelles, depuis SQL Server 2005, la base de données offre un accès aux métadonnées en utilisant des fonctions de table au lieu de procédures (vous pouvez ainsi combiner et filtrer les données résultantes). –

0

OPENROWSET dans une table temporaire, à partir de laquelle vous pouvez faites votre insertion

De this link:

use tempdb 
go 

select 
    a.* 
into 
    MyTemp 
from 
    openrowset('SQLOLEDB','SERVER=(local);Trusted_Connection=yes;', 
    ' 
    SET FMTONLY OFF; 
    EXEC SP_HELPDB 
    ') a 

INSERT INTO MyTable (a, b, c) 
select a, b, c from MyTemp 

drop table MyTemp 
+0

Comment cela va-t-il insérer des colonnes d'une procédure dans une autre? Ceci est une requête de sélection – mattgcon

+0

Cela ne doit être utilisé qu'en dernier recours si pour une raison quelconque vous ne pouvez pas convertir la procédure en une fonction de table, car elle ouvre * une autre connexion * à la base de données et vous devez activer les connexions distantes juste pour cela (OPENROWSET et OPENDATAQUERY sont désactivés par défaut en commençant par SQL Server 2005). –

+0

@mattgcon - merci, j'avais l'intention d'éditer l'exemple avant de me balader pour prendre un café. – LesterDove