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

#sql #sql-server #vb.net #asp-classic #adodb

#sql-server #vbscript #asp-classic #adodb

Вопрос:

Я хочу получить как код возврата, так и набор результатов из хранимой процедуры в классическом 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
  

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

Комментарии:

1. Возвращаемое значение предназначено для возврата кода состояния выполнения, а не для возврата значений. Если вы хотите получить значения обратно из процедуры, вы должны использовать ВЫХОДНЫЕ параметры.

2. @SeanLange они используют его для возврата статуса выполнения, 2 для отсутствия записей и 1 для некоторых.

3. @Lankymart Я вежливо не соглашусь. Это не возвращает статус выполнения, это возвращает логическое значение. Это отличный пример того, когда мы должны использовать выходной параметр.

4. @SeanLange честно говоря, вы разделяете волосы, вы хотите быть педантичным в этом, это зависит от вас. Даже Microsoft не согласна — см. RETURN (Transact-SQL) — Пример B. Возвращаемые коды состояния.

5. @Lankymart Я, конечно, не воспринимал это как-то иначе. Как вы сказали, это в основном предпочтение.

Ответ №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 значения и не будут доступны, пока не будут закрыты все возвращенные наборы записей.

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

 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
  

Комментарии:

1. Извините, я всегда получаю vartype 0 (vbEmpty — указывает на пустой (неинициализированный))

2. @DavidElliott это потому Recordset , что объект должен быть закрыт, прежде чем вы сможете прочитать какие OUTPUT -либо RETURN значения или. См. раздел Свойство значения (ADO) , в частности, поле примечания — «Если команда содержит параметр, свойство значения которого пустое, и вы создаете набор записей из команды, убедитесь, что вы сначала закрыли набор записей перед извлечением свойства значения».