2012-06-06 18 views
8

Ich verwende SQL Server. Ich rufe eine gespeicherte Prozedur von einer anderen gespeicherten Prozedur auf.Rückgabe mehrerer Werte aus einer gespeicherten Prozedur

Ich möchte mehrere Werte aus der ersten gespeicherten Prozedur zurückgeben.

Beispiel: Ich rufe Sub_SP von Master_SP. Sub_SP gibt mehrere Werte an Master_SP zurück.

Kann jemand ein Beispiel mit OUTPUT-Parametern geben?

Vielen Dank.

+0

Array zum Beispiel erste Idee. – Sajmon

+0

nur OUTPUT Parameter – Shami

+0

Ich glaube @mithrandir schlug vor, Sie sollten Ihren Code posten .... –

Antwort

16
ALTER procedure ashwin @empid int,@empname varchar(20) output,@age int output 
as 
select @empname=ename,@age=age 
from emp where [email protected]; 

declare @ename varchar(20),@age int 
execute ashwin 101,@ename out,@age out 
select @ename,@age; 

// ------------

namespace sqlserver 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      createconnection(); 
     } 
     public static void createconnection() 
     { 
      SqlConnection con=new SqlConnection("Data Source=ASHWIN\\SQLEXPRESS;Initial Catalog=employee;Integrated Security=True;Pooling=False"); 
      con.Open(); 

      SqlCommand cmd=new SqlCommand("ashwin",con); 
      cmd.CommandType=CommandType.StoredProcedure; 
      cmd.Parameters.Add(new SqlParameter("@empid",SqlDbType.Int,10,"empid")); 
      cmd.Parameters.Add(new SqlParameter("@empname", SqlDbType.VarChar, 20,ParameterDirection.Output,false,0,20,"ename",DataRowVersion.Default,null)); 
      cmd.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 20, ParameterDirection.Output, false, 0, 10, "age", DataRowVersion.Default, null)); 
      cmd.Parameters[0].Value = 101; 
      cmd.UpdatedRowSource = UpdateRowSource.OutputParameters; 
      cmd.ExecuteNonQuery(); 
      string name = (string)cmd.Parameters["@empname"].Value; 
      int age = Convert.ToInt32(cmd.Parameters["@age"].Value); 
      Console.WriteLine("the name is {0}--and age is {1}", name,age); 


      Console.ReadLine(); 
     } 
    } 
7

Wie wäre es damit:

CREATE PROCEDURE dbo.SubSP 
    @Value1 INT OUTPUT, @Value2 INT OUTPUT 
AS 
    -- just return two values into the OUTPUT parameters somehow.... 
    SELECT @Value1 = 42, @Value2 = 4711 

Testen Sie die dbo.SubSP:

DECLARE @Out1 INT, @Out2 INT 

EXEC dbo.SubSP @Out1 OUTPUT, @Out2 OUTPUT -- int 

SELECT @Out1, @Out2 

Gibt Ausgang:

@Out1 @Out2 
    42  4711  

Dann "Master" gespeicherte Prozedur erstellen:

CREATE PROCEDURE dbo.MasterSP 
    @SomeValue1 INT OUTPUT, @SomeValue2 INT OUTPUT, @SomeValue3 INT OUTPUT 
AS BEGIN 
    DECLARE @Out1 INT, @Out2 INT 

    -- call the "sub" stored procedure and capture OUTPUT values 
    EXEC dbo.SubSP @Out1 OUTPUT, @Out2 OUTPUT 

    -- return those values - plus some others - from master stored procedure 
    SELECT @SomeVAlue1 = @Out1, @SomeVAlue2 = @Out2, @SomeValue3 = 9901 
END 

Test-Master gespeicherte Prozedur:

DECLARE @Some1 INT, @Some2 INT, @Some3 INT 

EXECUTE dbo.MasterSP @Some1 OUTPUT, @Some2 OUTPUT, @Some3 OUTPUT 

SELECT @Some1, @Some2, @Some3 

Ausgang Gibt:

(No column name) (No column name) (No column name) 
     42    4711   9901 

funktionierts? Löst das dein Problem? Wenn nicht: wo stecken Sie fest, was genau ist das Problem?

0

hatte ich das gleiche Problem, und ich arbeite in VB. Ich habe die Antwort von @ Scorpian275 ausprobiert. Dies ist die gleiche Lösung wie @ Scorpian275, aber für die VB. Der SQL-Teil ist der gleiche.

Public Shared Sub createConnection() 
     Dim con As SqlConnection = New SqlConnection("Data Source=ASHWIN\\SQLEXPRESS;Initial Catalog=employee;Integrated Security=True;Pooling=False") 
     con.Open 
     Dim cmd As SqlCommand = New SqlCommand("ashwin", con) 
     cmd.CommandType = CommandType.StoredProcedure 
     cmd.Parameters.Add(New SqlParameter("@empid", SqlDbType.Int, 10, "empid")) 
     cmd.Parameters.Add(New SqlParameter("@empname", SqlDbType.VarChar, 20, ParameterDirection.Output, false, 0, 20, "ename", DataRowVersion.Default, Nothing)) 
     cmd.Parameters.Add(New SqlParameter("@age", SqlDbType.Int, 20, ParameterDirection.Output, false, 0, 10, "age", DataRowVersion.Default, Nothing)) 
     cmd.Parameters(0).Value = 101 
     cmd.UpdatedRowSource = UpdateRowSource.OutputParameters 
     cmd.ExecuteNonQuery 
     Dim name As String = CType(cmd.Parameters("@empname").Value,String) 
     Dim age As Integer = Convert.ToInt32(cmd.Parameters("@age").Value) 
     Console.WriteLine("the name is {0}--and age is {1}", name, age) 
     Console.ReadLine 
    End Sub 

Der letzte Parameter in cmd.Parameters.Add (New SqlParameter ("@ age", SqlDbType.Int, 20, ParameterDirection.Output, falsch, 0, 10, "Alter", DataRowVersion.Default, Nothing)) ist der Anfangswert, den wir für diese Variablen bereitstellen (Here Nothing).

Verwandte Themen