У меня проблемы с возвратом значения из таблицы SQL в переменную в vba. Я использую динамический SQL с хранимой процедурой, которая принимает 4 входных параметра и один выходной параметр. После выполнения хранимой процедуры должна быть возвращена плотность типа металла, который передается в качестве параметра. В настоящее время я выполняю код с использованием жестко закодированных тестовых значений в качестве параметров, поэтому я могу ожидать вывода. Я не верю, что проблема в моем соединении или в том, как я передаю свои параметры - но я все равно покажу их.
Всякий раз, когда я устанавливаю свою переменную 'output' (String), равную выходному параметру хранимой процедуры, я получаю ОШИБКУ 0.
Если что-то отсутствует в моем коде, дайте мне знать. В противном случае, если есть лучший способ возврата выходного параметра, я тоже могу попробовать это.
Я попытался выполнить хранимую процедуру в SQL с использованием заданных значений.
Приведенный ниже код был сгенерирован автоматически, когда я выполнил хранимую процедуру, щелкнув ее правой кнопкой мыши в SSMS (я хотел посмотреть, как она будет выполняться из vba) - потому что она возвращает неправильное значение Я думаю, что проблема заключается в в моей хранимой процедуре и не обязательно VBA.
USE [AFCD]
GO
DECLARE @return_value int,
@record_value nvarchar(max)
EXEC @return_value = [dbo].[GET_ADDITIVE_DATA]
@user_index = N'Titanium(1)',
@primary_col_index = N'DENSITY',
@secondary_col_index = N'WIRE_TYPE',
@data_table_name = N'WIRE_INDEX',
@record_value = @record_value OUTPUT
SELECT @record_value as N'@record_value'
SELECT 'Return Value' = @return_value
GO
Выходные данные этого запроса возвращают параметр @record_value, равный 0,163, который является правильным, но параметр @return_value равен 0, что я не понимаю.
- Хранимая процедура:
USE AFCD
GO
ALTER PROCEDURE dbo.GET_ADDITIVE_DATA (@user_index nvarchar(max),
@primary_col_index nvarchar(max),
@secondary_col_index nvarchar(max),
@data_table_name nvarchar(max),
@record_value nvarchar(max) output
) AS
BEGIN
DECLARE @query nvarchar(max)
SET @query = 'SELECT @record_value = ' + @primary_col_index +
' FROM ' + @data_table_name +
' WHERE ' + @secondary_col_index + ' = ''' + @user_index + ''''
EXEC sp_executesql @query,
N'@record_value nvarchar(max) output',
@record_value = @record_value output
END
'VBA CODE:
Private output As String
'-------------------------------------------------------------------------
' Parameters are passed in that will be used to create a SQL statement
' for a stored procedure.
Public Sub SQL_StoredProcedure(ByVal sql_ui As String, ByVal sql_pci As String, ByVal sql_sci As String, ByVal sql_dtn As String)
'
'
'
'
sqlcmd.ActiveConnection = sqlconxn ' makes the sql connection
sqlcmd.CommandType = adCmdStoredProc ' sets command to a stored procedure
sqlcmd.CommandText = "GET_ADDITIVE_DATA" ' name of the stored procedure
' Parameters that need to be called and defined whenever the stored procedure is called
sqlcmd.Parameters.Append sqlcmd.CreateParameter("@user_index", adVarChar, adParamInput, 255)
sqlcmd.Parameters.Append sqlcmd.CreateParameter("@primary_col_index", adVarChar, adParamInput, 255)
sqlcmd.Parameters.Append sqlcmd.CreateParameter("@secondary_col_index", adVarChar, adParamInput, 255)
sqlcmd.Parameters.Append sqlcmd.CreateParameter("@data_table_name", adVarChar, adParamInput, 255)
sqlcmd.Parameters.Append sqlcmd.CreateParameter("@record_value", adVarChar, adParamOutput, 255)
' Parameter values are set equal to the values passed in through excel by the user
' The stored procedure in SQL opertaes using dynamic SQL so all inputs are defined as String values
sqlcmd.Parameters("@user_index").Value = sql_ui
sqlcmd.Parameters("@primary_col_index").Value = sql_pci
sqlcmd.Parameters("@secondary_col_index").Value = sql_sci
sqlcmd.Parameters("@data_table_name").Value = sql_dtn
Set sqlrs = New ADODB.recordSet ' new recordset
sqlrs.CursorType = adOpenStatic
sqlrs.LockType = adLockOptimistic
sqlrs.Open sqlcmd ' Execute the stored procedure
output = sqlcmd.Parameters("@record_value").Value
Debug.Print "OUTPUT: " & output
sqlconxn.Close
End Sub
Журнал отладки должен просто отображать значение плотности:
Пример:
0,163