Вернуть значение и результирующий набор из классической хранимой процедуры asp

Я хочу получить как код возврата, так и набор результатов из хранимой процедуры в классическом ASP.

CREATE PROCEDURE CheckEmployeeId
@EmployeeName nvarchar(255)
AS
BEGIN
    SET NOCOUNT ON;
DECLARE 
      @Exists       INT 
    , @RowCount     Int = 0
    , @ReturnValue  Int = 1


SELECT EmployeeId FROM Employees WHERE Name = @EmployeeName
set @RowCount = @@ROWCOUNT

if (@RowCount <> 1)
BEGIN
    SET @ReturnValue = 2 
END
ELSE
BEGIN
    SET @ReturnValue = 1
END

RETURN @ReturnValue 
END

Итак, в ASP я могу сделать следующее, чтобы получить возвращаемое значение

Set cmd = CreateObject("ADODB.Command")
with cmd
    .ActiveConnection = cnnstr
    .CommandType = adCmdStoredProc
    .CommandText = "CheckEmployeeId"
    .Parameters.Refresh
    .Parameters("@EmployeeName")    = EmployeeName
end with
cmd.Execute()
RetVal = cmd.Parameters("@RETURN_VALUE")

или это, чтобы получить набор результатов.

Set cmd = CreateObject("ADODB.Command")
with cmd
    .ActiveConnection = cnnstr
    .CommandType = adCmdStoredProc
    .CommandText = "CheckEmployeeId"
    .Parameters.Refresh
    .Parameters("@EmployeeName")    = EmployeeName
    Set rst = .Execute()
end with

Есть ли способ получить оба?


person David Elliott    schedule 06.02.2017    source источник
comment
Возвращаемое значение предназначено для возврата кода состояния выполнения, а не для возврата значений. Если вы хотите получить значения из процедуры, вы должны использовать параметры OUTPUT.   -  person Sean Lange    schedule 06.02.2017
comment
@SeanLange они используют его, чтобы вернуть статус выполнения, 2 для отсутствия записей и 1 для некоторых.   -  person user692942    schedule 06.02.2017
comment
@Lankymart Я вежливо не соглашусь. Это не возвращает статус выполнения, это возвращает логическое значение. Это отличный пример того, когда мы должны использовать выходной параметр.   -  person Sean Lange    schedule 06.02.2017
comment
@SeanLange, честно говоря, ты путаешь волосы, ты хочешь быть педантичным в этом, это зависит от тебя. Даже Microsoft не согласна — см. RETURN (Transact-SQL) - Пример B. Возврат кодов состояния.   -  person user692942    schedule 06.02.2017
comment
@Lankymart, вероятно, прав. Вместо этого я предпочитаю использовать выходной параметр. :)   -  person Sean Lange    schedule 06.02.2017
comment
@SeanLange, если честно, во многом это личное предпочтение, я не был не согласен с вами, просто думаю, что не возвращать значения - это не столько мнение, сколько команда. Честно говоря, я бы, наверное, использовал OUTPUT этот экземпляр, но каждый по-своему.   -  person user692942    schedule 06.02.2017
comment
@Lankymart Я, конечно, не воспринял это иначе. Как вы сказали, это в основном предпочтения.   -  person Sean Lange    schedule 06.02.2017


Ответы (1)


Вы уже делаете это, просто объедините два.

Set cmd = CreateObject("ADODB.Command")
with cmd
    .ActiveConnection = cnnstr
    .CommandType = adCmdStoredProc
    .CommandText = "CheckEmployeeId"
    .Parameters.Refresh
    .Parameters("@EmployeeName") = EmployeeName
    Set rst = .Execute()
end with
'You will need to close the Recordset before returning the RETURN_VALUE.
RetVal = cmd.Parameters("@RETURN_VALUE")

Вам не нужно выбирать одно или другое, они не зависят друг от друга. Единственной проблемой будет порядок, в котором они возвращаются. Помните, что значения OUTPUT и RETURN будут недоступны, пока все возвращенные наборы записей не будут закрыты.

Лично я предпочитаю закрывать их сразу, сохраняя в виде двумерных массивов.

Set cmd = CreateObject("ADODB.Command")
with cmd
    .ActiveConnection = cnnstr
    .CommandType = adCmdStoredProc
    .CommandText = "CheckEmployeeId"
    .Parameters.Refresh
    .Parameters("@EmployeeName") = EmployeeName
    Set rst = .Execute()
    If Not rst.EOF Then data = rst.GetRows()
    Call rst.Close()
end with
RetVal = cmd.Parameters("@RETURN_VALUE")

'Access Recordset array
If IsArray(data) Then
  'Return first column, first row.
  Response.Write data(0, 0)
End If
person user692942    schedule 06.02.2017
comment
Извините, я всегда получаю vartype 0 (vbEmpty - указывает на пустой (неинициализированный)) - person David Elliott; 06.02.2017
comment
@DavidElliott это потому, что объект Recordset должен быть закрыт, прежде чем вы сможете прочитать любые значения OUTPUT или RETURN. См. свойство Value (ADO) в частности поле «Примечание». Если команда содержит параметр, свойство Value которого пусто, и вы создаете набор записей из команды, убедитесь, что вы сначала закрыли набор записей, прежде чем извлекать свойство Value. - person user692942; 06.02.2017