2009-11-09 5 views
0

J'utilise SQL 2000. J'ai un proc stocké, spGetApplicantList, qui ne peut pas être modifié. Je dois obtenir le LastNameInitials unique de tous les enregistrements dans ce proc stocké, de sorte que la liste des candidats peut être triée par ordre alphabétique.Appeler les jeux de résultats à partir d'un processus stocké

Fondamentalement, ce que j'ai besoin est

SELECT DISTINCT LEFT(LastName, 1) as [LastNameInitial] 
FROM spGetApplicantList 
ORDER BY LastnameFirstInitial 

Comment puis-je créer un nouveau proc stocké, spGetLastNameInitial, en utilisant le retour de spGetApplicantList recordset?

Je n'arrive pas à obtenir la syntaxe correcte.

Répondre

1

Vous devez exécuter le premier sproc spGetApplicantList dans une table temporaire, puis l'interroger. Vous ne pouvez pas appeler des procédures stockées en ligne dans des instructions SELECT comme cela malheureusement.

-- Create temp table, with the schema matching the results of spGetApplicantList 
CREATE TABLE #TempResults 
(
LastName VARCHAR(50) 
) 

INSERT #TempResults 
EXECUTE spGetApplicantList 

Select DISTINCT LEFT(LastName, 1) as [LastNameInitial] from #TempResults Order by LastnameFirstInitial 

DROP TABLE #TempResults 

L'alternative, est de dupliquer le SELECT de la procédure stockée originale mais juste faire le DISTINCT au lieu de retourner le plein resultset - qui vous évitera de devoir charger toutes les données dans une table temporaire.

+0

Je suis en train de votre code, mais obtenir un « Serveur: Msg 213, niveau 16, état 7, Procédure spGetApplicantList, ligne 371 Insérer Erreur: Nom de la colonne ou le nombre de les valeurs fournies ne correspondent pas à la définition de la table. " – DotNetRookie

+1

Vous devez vous assurer que la table #TempResults est définie avec les mêmes colonnes que celles renvoyées par spGetApplicantList. Comme je ne connais pas les colonnes/types de données renvoyées par sproc, je viens de donner un exemple basique en supposant qu'il ne retournait qu'une seule colonne "LastName" de type VARCHAR (50) – AdaTheDev

+0

Donc je suppose qu'il n'est pas possible d'insérer seulement une colonne LastName dans la table temporaire? Je dois refléter la table temporaire pour refléter les colonnes dans spGetApplicantList? – DotNetRookie

0

C'est de ce lien: Calling SP from SP

  1. Comment puis-je utiliser les résultats d'une procédure stockée dans un autre?

Tant que la procédure stockée ne produit qu'un résultat unique, la technique d'utilisation de la sortie d'une procédure stockée dans une autre est assez simple. La technique consiste à utiliser une table temporaire pour contenir les résultats de la procédure stockée et une instruction INSERT EXEC pour exécuter le sproc et enregistrer les résultats. Une fois que les résultats sont dans la table temporaire, ils peuvent être utilisés comme n'importe quelle autre donnée de table. Voici un exemple de procédure que nous pourrions vous réutiliser:

CREER PROC usp_Demo_AllAuthors comme

select * from pubs..authors 

GO

Maintenant, voici une procédure stockée qui utilise les résultats de usp_Demo_AllAuthors:

create proc usp_Demo_SPUser en tant que

CREATE TABLE #Authors (
au_id varchar(11) NOT NULL PRIMARY KEY CLUSTERED, 
au_lname varchar (40) NOT NULL , 
au_fname varchar (20) NOT NULL , 
phone char (12) NOT NULL, 
address varchar (40) NULL , 
city varchar (20) NULL , 
state char (2) NULL , 
zip char (5) NULL , 
contract bit NOT NULL 
) 

-- Execute usp_Demo_AllAuthors storing the 
-- results in #Authors 
insert into #Authors 
exec usp_Demo_AllAuthors 

-- Here we use the #Authors table. This example only 
-- only selects from the temp table but you could do much 
-- more such as use a cursor on the table or join with 
-- other data. 
SELECT au_fName + ' ' + au_lname as [name] 
    , address+', '+city+', '+state+' '+zip [Addr] 
    from #Authors 

DROP TABLE #Authors 

GO

-Andrew Novick, Expert SQL Server

Questions connexes