1

Я пытаюсь получить выходную переменную (новый столбец идентификации) из хранимой процедуры в SQL Server 2008 после выполнения процедуры из Access 2013 VBA. Я не совсем понимаю все материалы adodb, и я пробовал несколько вещей из разных статей безрезультатно. Вот где я с ним сейчас ...Использование выходного параметра из хранимой процедуры SQL Server в Access

Хранимая процедура:

PROCEDURE [proc_NewClient] 
    @Type INT, 
    @PhoneIntakeID INT, 
    @ClientID INT = NULL, 
    @NewPSID INT = null OUTPUT (2 possible ways to call the proc, one does not produce an output variable) 

    INSERT INTO tblClientDetails (ClientID, PhoneIntakeID, Client_Status) 
    VALUES (@ClientID, @PhoneIntakeID, 'Applicant') 

    DECLARE @NewClientDetailID int 
    SELECT @NewClientDetailID = SCOPE_IDENTITY() 

    INSERT INTO tblPS_Psychosocial (ClientDetailID, Client) 
    VALUES (@NewClientDetailID, @ClientID) 

    SELECT @NewPSID = SCOPE_IDENTITY() 

    INSERT INTO tblPS_AbuseHistory (PsychosocialID) 
    VALUES (@NewPSID) 

    INSERT INTO tblPS_FamilyHistory(PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_FinancialHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_LegalHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_MedicalHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_PsychiatricHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_SocialHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_SpiritualHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_SubstanceHistory (PsychosocialID) VALUES (@NewPSID) 

    INSERT INTO tblVocAssessment(ClientDetailID) VALUES (@NewClientDetailID) 

А из формы я получил:

Dim cnn As ADODB.Connection 
      Dim cmd As New ADODB.Command, rs As New ADODB.Recordset, param1 As New ADODB.Parameter, param2 As New ADODB.Parameter, param3 As New ADODB.Parameter, param4 As New ADODB.Parameter 
      Set cnn = New ADODB.Connection 
      cnn.ConnectionString = "DRIVER=SQL Server;SERVER=SRV-DB01;DATABASE=TWHClientMgmt;Trusted_Connection=Yes" 

      cnn.Open cnn.ConnectionString 

      Set cmd = New ADODB.Command 
      cmd.ActiveConnection = cnn 
      cmd.CommandType = adCmdStoredProc 
      cmd.CommandText = "[THEWOMENSHOME\jboyd].proc_NewClient" 


      Set param1 = cmd.CreateParameter("@Type", adinteger, adparamInput, , 2) 
      cmd.Parameters.Append param1 
      Set param2 = cmd.CreateParameter("@PhoneIntakeID", adinteger, adparamInput, , Me.PhoneIntakeID) 
      cmd.Parameters.Append param2 
      Set param3 = cmd.CreateParameter("@ClientID", adinteger, adparamInput, , intNewID) 
      cmd.Parameters.Append param3 
      Set param4 = cmd.CreateParameter("@NewPSID", adinteger, adParamOutput) 
      cmd.Parameters.Append param4 

rs.open cmd 

В данный момент код работает, новые записи сгенерированы и т. д. Когда я запускаю хранимую процедуру с SQL Server, он возвращает правильный номер столбца идентификатора, но я попытался несколько способов ссылаться на вывод в VBA и всегда заканчивать с нулевым значением. Как я могу здесь ссылаться здесь правильно?

+1

Вместо 'rs.Open' попробуйте' cmd.Execute', а затем посмотрите, можно ли получить значение выходного параметра с помощью 'cmd.Parameters (« @ NewPSID »). Value'. –

+1

Вы также можете сделать SP, возвращающий набор записей, с одной колонкой/одним столбцом с новыми идентификационными данными и прочитать эти данные, используя предложение select в сквозном запросе –

+0

@GordThompson благодарит вас! Я пробовал эту комбинацию, но БЕЗ значения. По параметру, это был билет !! Теперь он отлично работает! –

ответ

3

Чтобы получить значение параметра OUTPUT хранимой процедуры, ты просто .Execute ADODB.Command, а затем извлечь .Value соответствующего ADODB.Parameter, например, так:

cmd.Execute 
' retrieve and display the returned OUTPUT parameter value 
Debug.Print cmd.Parameters("@NewPSID").Value 
0

Простое решение DAO вызова хранимой процедуры:

Public Function RunSqlQuery(q As String) As Variant 

Dim cdb As DAO.Database 
Dim qdf As DAO.QueryDef 
Dim rs As Recordset 

Set cdb = CurrentDb 
Set qdf = cdb.CreateQueryDef("") 
qdf.Connect = cdb.TableDefs("dbo_Setup").Connect ' your attached table 
qdf.SQL = q 
qdf.ReturnsRecords = True 
Set rs = qdf.OpenRecordset() 
RunSqlQuery = rs.Fields(0) ' you also can output more than one parameter from a stored procedure as fields 
rs.Close 
Set rs = Nothing 
Set qdf = Nothing 
Set cdb = Nothing 

End Function 

Теперь, вызовите функцию, определить запрос так же, как вы могли бы сделать на сервере SQL:

? RunSQLQuery("DECLARE @param1 varchar(16); exec proc_MyStoredProcedure @param1 OUTPUT; SELECT @param1") 
Смежные вопросы