2017-02-06 4 views
2

반환 코드와 결과 집합을 모두 원래 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 

두 가지 방법이 있습니까?

+0

반환 값은 반환 값이 아닌 실행 상태 코드를 반환하기위한 것입니다. 프로 시저에서 값을 다시 받으려면 OUTPUT 매개 변수를 사용해야합니다. –

+0

@SeanLange 그들은 실행 상태를 반환하기 위해 그것을 사용하고 있습니다. 레코드가 없으면 2, 일부 경우에는 1을 반환합니다. – Lankymart

+0

@Lankymart 나는 정중하게 동의하지 않을 것이다. 실행 상태가 반환되지 않고 논리 값이 반환됩니다. 이것은 출력 매개 변수를 사용해야하는 좋은 예입니다. –

답변

2

이미 두 개를 결합하면됩니다.

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") 

서로를 독립적으로 선택할 필요가 없습니다. 유일한 문제는 반환하는 순서이므로 OUTPUTRETURN 값은 반환 된 모든 레코드 집합이 닫힐 때까지 액세스 할 수 없습니다.

저는 개인적으로 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 
+0

죄송합니다 항상 vartype 0 (vbEmpty - 비어 있음 (초기화되지 않음)을 나타냅니다.) –

+1

@DavidElliott 그것은'Recordset' 개체가'OUTPUT' 또는'RETURN' 값을 읽기 전에 닫혀 야하기 때문입니다. 메모 상자를 구체적으로 설명하는 [Value Property (ADO)] (https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/value-property-ado)를 참조하십시오. * "명령에 Value 속성이 비어있는 매개 변수와 명령에서 Recordset을 만들려면 먼저 Value 속성을 검색하기 전에 Recordset을 닫아야합니다. "* – Lankymart

+2

: 편집 된 버전이 이제 의미가 있습니다. 감사합니다. –