Darrell Burns
dhb at flsi.com
Sun Aug 7 13:29:54 CDT 2011
John, After testing my own code, I found that it didn't work as advertised. I hope you didn't waste any time with it. Here's some sample code that really does work. It's an excerpt from a sproc that takes in a tablename as an input, and returns which SQL database(s) that table is found in. ---------------------------------------------------------------------------- -------------------------------------------- Sproc returns a recordset, a text value, and a status code (which I'm using here to return a count)... < a bunch of T-SQL code> SELECT * FROM @DBList; --returns output as a recordset SET @OutVal = @DBNames; --returns output as a concatenated string RETURN @NumDBs --returns number of databases in which table was found END a) Access VBA Code executes the sproc and reads the recordset... Set rOutput = ADOCommand.Execute RecordsetOut = Null If Not (rOutput.BOF And rOutput.EOF) Then Do While Not rOutput.EOF RecordsetOut = IIf(IsNull(RecordsetOut), "", RecordsetOut + "; ") + rOutput.Fields(0) rOutput.MoveNext Loop b) Access reads the output string... OutVal = ADOCommand.Parameters(OutputParmName).Value c) Access reads the return status, which is always in the first parameter... ReturnStatus = ADOCommand.Parameters(0).Value Debug.Print "RetVal = " & RetVal & vbCrLf & "OutVal = " & OutVal & vbCrLf & "RecordsetOut = " & RecordsetOut RetVal = 2 OutVal = [CRMA Central]; [CRMA_Import] RecordsetOut = [CRMA Central]; [CRMA_Import] Here are a couple of gotchas: If you execute the sproc with this command [Set rOutput = ADOCommand.Execute] but don't read the recordset, this is the result ... RetVal = 0 OutVal = RecordsetOut = If you execute the sproc with this command [Set rOutput = ADOCommand.Execute] and read the output values (steps b and c) before the recordset (step a)... RetVal = 0 OutVal = RecordsetOut = [CRMA Central]; [CRMA_Import] However, if you don't need to read the recordset, execute the sproc with this command [ADOCommand.Execute] and you'll get the correct output... a) Access VBA Code executes the sproc... ADOCommand.Execute b) Access reads the output string... OutVal = ADOCommand.Parameters(OutputParmName).Value c) Access reads the return status... ReturnStatus = ADOCommand.Parameters(0).Value Debug.Print "RetVal = " & RetVal & vbCrLf & "OutVal = " & OutVal & vbCrLf & "RecordsetOut = " & RecordsetOut RetVal = 2 OutVal = [CRMA Central]; [CRMA_Import] RecordsetOut = HTH, Darrell -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Darrell Burns Sent: Saturday, August 06, 2011 8:23 AM To: 'Access Developers discussion and problem solving' Subject: [Spam]8.51 Re: [AccessD] Stored procedures as Queries Hi John. My preference is to let the stored procedure do all the work and then pass back either a value or a recordset to Access. Try this... Dim ADOCommand As New adodb.Command Dim ADOParms As New adodb.parameter 'one row per input variable required by the sproc ADOCommand.ActiveConnection = SQLConnect 'connection string ADOCommand.CommandText = "sproc" 'stored procedure name ADOCommand.CommandType = adCmdStoredProc Dim InVal As Variant 'a value passed to the stored procedure Dim ReturnType As Integer '0=single value, 1=recordset If ReturnType = 0 Then Dim RetVal As Long 'if the sproc returns a single value Else Dim rReturn As New adodb.Recordset 'if the sproc returns a recordset End If 'append Input parameter(s) needed by the sproc... Set ADOParms = ADOCommand.CreateParameter("InputParmName", adVarChar, adParamInput, 200, InVal) ADOCommand.Parameters.Append ADOParms 'append an Output parameter if the sproc produces a return value... Set ADOParms = ADOCommand.CreateParameter("OutputParmName", adVarChar, adParamInput, 200, "OutputParmName") ADOCommand.Parameters.Append ADOParms ADOCommand.Execute If ReturnType = 0 Then 'execute this command if the stored procedure returns a single value... RetVal = ADOCommand.Parameters("OutputParmName").Value 'Return value Else 'execute this command if the stored procedure returns a recordset... Set rReturn = ADOCommand.Execute End If HTH, Darrell -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby Sent: Friday, August 05, 2011 8:58 PM To: Access Developers discussion and problem solving Subject: [AccessD] Stored procedures as Queries I am using pass through queries where I reference a stored procedure and pass a param through. At the moment I am having to open the querydef and replace the parameter with some value, save the sql of the querydef and then save the querydef. Is there any other way to do this? It seems crude to the max. -- John W. Colby www.ColbyConsulting.com -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com