2013-07-25 17 views
5

To powinno być naprawdę łatwe, ale nie znalazłem jeszcze prawdziwej zwięzłej odpowiedzi. Mam bardzo prostą procedurę przechowywaną na serwerze sql, która zwraca wartość całkowitą. Wszystko, co chcę zrobić, to uzyskać tę wartość zwracaną w zmiennej do użycia w programie Access.Przypisanie zwracanej wartości procedury składowanej do zmiennej VBA

procedury przechowywanej:

ALTER PROCEDURE [dbo].[out_GetNextID] 
@NextSumID integer 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT @NextSumID = IDENT_CURRENT('Outage Summary')+IDENT_INCR('Outage Summary') 
RETURN @NextSumID 
END 

Używam ADODB wykonać procedurę przechowywaną, i czuję się głupi do konieczności zapytać, ale w jaki sposób mogę uzyskać dostęp do wartości zwracanej w dostępie po biegnę cmd.Execute ? Z góry dziękuję i przepraszam za kulawe pytanie.

Odpowiedz

4

Dostępne są dwa podejścia, przy użyciu parametrów wyjściowych lub ustawienie ReturnValue (omówione poniżej). Dla parametrów wyjściowych, cytując z tego SO link:

zasadniczo wystarczy, aby stworzyć SqlParameter ustawić kierunek do wyjścia, i dodać go do kolekcji Parameters SQLCommand za. Następnie wykonaj procedurę przechowywaną i pobierz wartość parametru.

Zobacz kod z tej strony.

Jednak trzeba także zawierać słowo (lub wyjście) w deklaracji zmiennej:

@NextSumID integer OUT 

Kiedy deklarujesz zmienną jako OUT (lub wyjście) zostanie zwrócony automatycznie, z jakiejkolwiek wartości ma to miejsce, gdy procedura się kończy, więc możesz po prostu użyć RETURN.

Return Data from a Stored Procedure :MSDN

Można zamiast tego użyć RETURN @NextSumID bo jesteś po prostu powrocie pojedynczy, Integer wartość. W tym podejściu, należy określić parametr jako ReturnValue:

theParameter.Direction = ParameterDirection.ReturnValue 

Takie podejście jest omówiony here (MSDN).

+0

Dziękuję za odpowiedź. Postanowiłem zrezygnować z 'RETURN @ NextSumID' i po prostu użyć' RETURN', ponieważ kluczowym elementem, którego mi brakowało, było po prostu przypisanie zmiennej przez 'NextID = cmd.Parameters (" @ NextSumID ")'. Nie wiem, dlaczego tak trudno było mi to rozgryźć. – philthyfool

+0

Zajęło mi trochę czasu, aby zebrać informacje dla mojej odpowiedzi;) –

+1

Mam wrażenie, że powinna istnieć jakaś lepsza dokumentacja/przykłady gdzieś do podstawowego użycia zmiennych wyjściowych procedury przechowywanej. Naprawdę łatwo jest znaleźć sytuacje, w których ludzie aktualizują zestawy rekordów i inne, ale nie wiele prostych sytuacji. Mam nadzieję, że to pomoże komuś innemu w podobnej sytuacji, jak ja. – philthyfool

1

Oto jak uzyskać wartość zwracaną za pomocą procedury przechowywanej, która zwraca wartość. Będziesz potrzebował odwołania do Microsoft ActiveX Data Objects 2.8 Library.

Sub CheckValue(ByVal NextSumID As Long) 

    'open connnection 
    Dim ACon As New Connection 
    ACon.Open ("Provider=SQLOLEDB;Data Source=<SqlServer>;" & _ 
     "Initial Catalog=<Table>;Integrated Security=SSPI") 

    'set command 
    Dim ACmd As New Command 
    Set ACmd.ActiveConnection = ACon 
    ACmd.CommandText = "out_GetNextID" 
    ACmd.CommandType = adCmdStoredProc 

    'Return value must be first parameter else you'll get error from too many parameters 
    'Procedure or function "Name" has too many arguments specified. 
    ACmd.Parameters.Append ACmd.CreateParameter("ReturnValue", adInteger, adParamReturnValue) 
    ACmd.Parameters.Append ACmd.CreateParameter("NextSumID", adVarChar, adParamInput, 10, NextSumID) 

    'execute query 
    Call ACmd.Execute 

    'get return value 
    Debug.Print "Return value: " & ACmd.Parameters("ReturnValue") 

    ACon.Close 

End Sub 
Powiązane problemy