8

Ho la seguente dichiarazione in una stored procedure:Come utilizzare un valore da una stored procedure in un'altra?

DECLARE @Count INT 
EXEC @Count = GetItemCount 123 
SELECT @Count 

che chiama un altro stored procedure con la seguente affermazione interna:

SELECT COUNT(Item) FROM tblItem WHERE ID = @ID 

Tuttavia quando prova la chiamata del EXEC emette il valore correttamente, ma it non è assegnato correttamente alla variabile @Count. Ho visto esempi o stored procedure usate in questo modo, incluso qui ma nessuno aveva un parametro e un valore di ritorno usato (che potessi trovare). Il parametro ID viene passato alla seconda istruzione che restituisce un valore di conteggio utilizzato dal primo StoredProcedure - tutte le informazioni che ho letto sembrano indicare che questo dovrebbe funzionare - ma non il valore @Count è lontano da zero, anche quando il GetItemCount restituisce sempre il valore corretto.

Questo è in Microsoft SQL Server 2008 se questo aiuta.

+0

ero in grado di farlo funzionare - avendo un'uscita come parametro era la soluzione - tenere dimenticare SQL non è come lo stile di programmazione a cui sono abituato. – RoguePlanetoid

risposta

22

Nel stored procedure, sono si sia

a) Assegnare il valore del conteggio ad un parametro di output:

CREATE PROCEDURE GetItemCount 
    @id INT, 
    @count INT OUTPUT 
AS 
    SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id 

chiamato come:

DECLARE @count INT 
EXEC GetItemCount 123, @count OUTPUT 

o, b) Assegnazione del valore di conteggio come valore di ritorno:

CREATE PROCEDURE GetItemCount 
    @id INT 
AS 
BEGIN 
    DECLARE @count INT 
    SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id 

    RETURN @count 
END 

chiamato come:

DECLARE @count INT 
EXEC @count = GetItemCount 123 
+0

Grazie per questo - ha funzionato - non pensavo che un output sarebbe stato un parametro - è per questo che non riuscivo a capire che stavo trattando l'output del display come output quando in realtà non veniva restituito nulla - quindi perché era zero quando Ho letto il valore. – RoguePlanetoid

+0

Ho cercato questo problema un po 'di volte da quando ho fatto questa domanda e sono tornato qui e ho trovato la soluzione, il desiderio poteva aumentare il voto ogni volta che mi ha aiutato! – RoguePlanetoid

2

Si dovrebbe passare @Count come parametro di output.

Create Proc dbo.usp_Proc1 

@Id int, 
@Count int output 

as begin 

select @Count = Count(Item) from tblItem where [email protected] 

end 
Go 

Declare @Count int 
Declare @Id int 

Set @Id = 1 

Exec dbo.usp_Proc1 @Id, @Count output 

select @Count 
+0

Anche questo esempio è stato utile per far funzionare correttamente la mia query, quindi grazie ancora. – RoguePlanetoid

0

Cosa si stanno recuperando in @Count variabile è lo stato di esecuzione della procedura GetItemCount memorizzato e non il valore come vi aspettate. Per acquisire quel valore, hai due modi.

  1. Per dichiarare un altro parametro @count come OUTPUT in GetItemCount. Così si avrà dichiarazione GetItemCount come segue

    CREATE PROCEDURE GetItemCount @ID int, int @count uscita

dentro, è possibile utilizzare

SELEZIONA @count = COUNT (Voce) FROM WHERE tblItem ID = @ID

  1. Per dichiarare una tabella prima di chiamare il proc e ottenere tale valore come colonna.
1

Un altro modo

DECLARE @Count table(counting INT) 
Insert into @Count 
EXEC GetItemCount 123 
SELECT Counting FROM @Count 
1

La soluzione (b) data dal signor Matteo non funzionerà quando u chiamano questo in un altro stored procedure (soluzione Naturalmente (a) funziona perfettamente quando usiamo param USCITA). L'alternanza per la soluzione (b) è la soluzione di Mr.Madhivanan. creare una tabella temporanea e utilizzarla, quindi rilasciarla.

Qui di seguito sono altre soluzioni ..

Non possiamo ottenere il valore da una clausola OUTPUT interna in una stored procedure direttamente. Quindi dobbiamo usare il parametro OUTPUT o il valore RETURN VALUE.

Si prega di fare riferimento ai seguenti suggerimenti:

SOLUZIONE 1:

CREATE PROCEDURE [dbo].[InsertProduct] 
     @pName varchar(50) 
AS 


BEGIN 
DECLARE @MyTableVar Table(ProductID 
int) 


     INSERT Products 
     ( 
      pName 
    ) 
     OUTPUT Inserted.ProductID 
INTO @MyTableVar 
     VALUES 
     ( 
     @pName 
    ) 
RETURN (SELECT ProductID 
FROM @MyTableVar) 
END 


DECLARE @ProductID int 
EXEC @ProductID = [dbo].insertproduc 'TEST' 
SELECT @ProductID 

SOLUZIONE: 2

CREATE PROCEDURE [dbo].[InsertProduct] 
     @pName varchar(50) , @pID int output 
AS 

BEGIN 
DECLARE @MyTableVar Table(ProductID int) 

     INSERT Products 
     (
      pName 
    ) 
     OUTPUT Inserted.ProductID INTO @MyTableVar 
     VALUES 
     (
     @pName 
    ) 
SELECT @pID=ProductID FROM @MyTableVar 
END 

DECLARE @ProductID int 
EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT 
SELECT @ProductID 
0

Quanto segue non funziona se non ci sono parametri di input per l'SP eseguito:

EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT --works 
EXEC [dbo].insertproduc, @ProductID OUTPUT -- generates a parameter supplied when not needed error message if the insertproduc does not require parameters. 

migliore di utilizzare il seguente formato per tutti i casi (funziona su tutte le versioni):

DECLARE @MyOutputVariable int 
EXEC @MyOutputVariable = [dbo].MyStoredProc