web-dev-qa-db-fra.com

Comment exécuter une procédure stockée dans une requête select

SELECT col1,
       col2,
       col3,

EXEC GetAIntFromStoredProc(T.col1) AS col4
     FROM Tbl AS T
     WHERE (col2 = @parm) 

Comment écrire cette requête SQL dans SQL Server 2008?

41
Joakim

Merci @ Twoleggedhorse.

Voici la solution.

  1. D'abord nous avons créé une fonction

    CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER
    
    AS
    BEGIN
       DECLARE @id INTEGER
    
       set @id= (select TOP(1) id From tbl where col=@parm)
    
       RETURN @id
    END
    
  2. alors nous faisons la requête select

    Select col1, col2, col3,
    GetAIntFromStoredProc(T.col1) As col4
    From Tbl as T
    Where col2=@parm
    
40
Joakim

Les fonctions sont faciles à appeler dans une boucle de sélection, mais elles ne vous permettent pas d'exécuter des insertions, des mises à jour, des suppressions, etc. Elles ne sont utiles que pour les opérations de requête. Vous avez besoin d'une procédure stockée pour manipuler les données.

Donc, la vraie réponse à cette question est que vous devez parcourir les résultats d'une instruction select via un "curseur" et appeler la procédure à partir de cette boucle. Voici un exemple:

DECLARE @myId int;
DECLARE @myName nvarchar(60);
DECLARE myCursor CURSOR FORWARD_ONLY FOR
    SELECT Id, Name FROM SomeTable;
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @myId, @myName;
WHILE @@FETCH_STATUS = 0 BEGIN
    EXECUTE dbo.myCustomProcedure @myId, @myName;
    FETCH NEXT FROM myCursor INTO @myId, @myName;
END;
CLOSE myCursor;
DEALLOCATE myCursor;

Notez que @@FETCH_STATUS est une variable standard mise à jour pour vous. Le reste des noms d'objet ici sont personnalisés.

29
BuvinJ

Tant que vous n'effectuez aucune instruction INSERT ou UPDATE dans votre procédure stockée, vous souhaiterez probablement en faire une fonction.

Les procédures stockées sont destinées à être exécutées par un programme externe ou sur un intervalle de temps.

Les réponses ici expliqueront mieux que je peux:

Fonction vs. Procédure stockée dans SQL Server

4
bd33

Vous pouvez créer une table temporaire correspondant à votre sortie proc et y insérer.

CREATE TABLE #Temp (
    Col1 INT
)

INSERT INTO #Temp
    EXEC MyProc
0
Steve Olson