복붙노트

[SQL] 저장 프로 시저의 반환 값을 얻는 방법

SQL

저장 프로 시저의 반환 값을 얻는 방법

아마 쉬운 대답 질문입니다. 나는이 절차를 가지고 :

CREATE PROCEDURE [dbo].[AccountExists]
    @UserName nvarchar(16)
AS
IF EXISTS (SELECT Id FROM Account WHERE UserName=@UserName)
SELECT 1
ELSE SELECT 0 

나는이 프로 시저를 호출하고이 작업을 수행 ADO.NET 코드가있는 경우 :

return Convert.ToBoolean(sproc.ExecuteScalar());

어느 true 또는 false가 반환됩니다.

나는 RETURN 1 또는 0 대신 SELECT에 저장 프로 시저를 변경하는 경우 :

ALTER PROCEDURE [dbo].[AccountExists]
    @UserName nvarchar(16)
AS
IF EXISTS (SELECT Id FROM Account WHERE UserName=@UserName)
RETURN 1
ELSE RETURN 0 

sproc.ExecuteScalar는 ()를 돌려줍니다. 내가 sproc.ExecuteNonQuery을하려고하면 () 대신에, -1이 돌려 주어집니다.

어떻게 ADO.NET에서 RETURN와 저장 프로 시저의 결과를 얻을 수 있습니까?

내가 다른 저장 프로 시저 호출을 할 수 있도록 내가 대신 SELECT의 RETURN에 AccountExists이 필요합니다 :

--another procedure to insert or update account

DECLARE @exists bit

EXEC @exists = [dbo].[AccountExists] @UserName 

IF @exists=1
--update account
ELSE
 --insert acocunt

해결법

  1. ==============================

    1.ParameterDirection.ReturnValue를 사용하여 매개 변수를 추가합니다. 리턴 값은 실행 후 파라미터 존재할 것이다.

    ParameterDirection.ReturnValue를 사용하여 매개 변수를 추가합니다. 리턴 값은 실행 후 파라미터 존재할 것이다.

  2. ==============================

    2.또한, 당신이 먼저 반환 된 결과 집합을 통해 루프가 ADO.NET에서 결과 (또는 그 문제에 대해 다른 출력 매개 변수)를 검색 (또는 NextResult로를 건너 뛰기)하기

    또한, 당신이 먼저 반환 된 결과 집합을 통해 루프가 ADO.NET에서 결과 (또는 그 문제에 대해 다른 출력 매개 변수)를 검색 (또는 NextResult로를 건너 뛰기)하기

    이 같은 정의 된 절차가있는 경우 있음이 수단 :

    CREATE PROC Test(@x INT OUT) AS
        SELECT * From TestTable
        SELECT @x = 1
    

    그리고이 작업을 수행하려고 :

    SqlCommand cmd = connection.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "Test"
    cmd.Parameters.Add("@x", SqlDbType.Int).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@retval", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
    
    cmd.Execute();
    int? x = cmd.Parameters["@x"].Value is DBNull ? null : (int?)cmd.Parameters["@x"].Value;
    

    그리고 X는 널 (null)이 포함됩니다. 그것이 작동되도록하려면 같은 절차를 수행해야합니다 :

    using (var rdr = cmd.ExecuteReader()) {
        while (rdr.Read())
            MaybeDoSomething;
    }
    int? x = cmd.Parameters["@x"].Value is DBNull ? null : (int?)cmd.Parameters["@x"].Value;
    

    예상대로 후자의 경우, X는 (1)를 포함한다.

  3. ==============================

    3.ExecuteScalar는 첫 번째 행의 첫 번째 열을 반환합니다. 당신이 선택하고 결과 집합을 만들어 더 이상 이었기 때문에이 널 (null)을 반환하고, 그 이유는 없습니다. 그냥 참고로. 존 손더스는 정답이있다.

    ExecuteScalar는 첫 번째 행의 첫 번째 열을 반환합니다. 당신이 선택하고 결과 집합을 만들어 더 이상 이었기 때문에이 널 (null)을 반환하고, 그 이유는 없습니다. 그냥 참고로. 존 손더스는 정답이있다.

  4. ==============================

    4.내 설정과 다른 솔루션을 시도하고 작동하지 않았다 그러나 나는 VB6 및 ADO 6.x를 사용하고 또한 0의 PROC 반환이 성공적으로 나타내는 것을 지적하고 싶다. 그 규칙이없는도 사용할 수있는 기능이 있습니다 잊지 마세요. MSDN에 발견하고 나를 위해 일했다 :

    내 설정과 다른 솔루션을 시도하고 작동하지 않았다 그러나 나는 VB6 및 ADO 6.x를 사용하고 또한 0의 PROC 반환이 성공적으로 나타내는 것을 지적하고 싶다. 그 규칙이없는도 사용할 수있는 기능이 있습니다 잊지 마세요. MSDN에 발견하고 나를 위해 일했다 :

    Debug.Print "starting at ..." & TimeValue(Now)
    
    Dim cn As New ADODB.Connection
    Dim cmd As New ADODB.Command
    'These are two possible connection strings. You could also have Integrated Security instead of these for SqS for security
    'cn.ConnectionString = "Data Source=[yourserver];User ID=[youruser];Password=[yourpw];Initial Catalog=[yourdb];Provider=SQLNCLI10.1;Application Name=[yourapp]"
    cn.ConnectionString = "Data Source=[yours];User ID=[youruser];Password=[yourpassword];Initial Catalog=[Yourdb];Provider=sqloledb;Application Name=[yourapp]"
    cn.Open
    
    cmd.ActiveConnection = cn
    cmd.CommandText = "AccountExists"
    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Append cmd.CreateParameter(, adInteger, adParamReturnValue)
    cmd.Parameters.Append cmd.CreateParameter("UserName",adVarChar, adParamInput, 16, UserNameInVB)
    
    cmd.Execute
    Debug.Print "Returnval: " & cmd.Parameters(0)
    cn.Close
    
    Set cmd = Nothing
    Set cn = Nothing
    
    Debug.Print "finished at ..." & TimeValue(Now)
    

    이 (을 Debug.Print)를 실행하면 결과는 즉시 창에 표시됩니다

  5. ==============================

    5.당신이 뭔가를 지정하지 않는 한 그냥 몇 가지 조언은하지만, 기본적으로 저장 프로 시저는 0을 반환합니다. 이 때문에, 0 종종 성공을 지정하는 데 사용되는 비 - 제로 값은 복귀 오류 상태를 지정하는 데 사용된다. 나는 요한의 제안에 이동하거나 출력 매개 변수를 사용합니다

    당신이 뭔가를 지정하지 않는 한 그냥 몇 가지 조언은하지만, 기본적으로 저장 프로 시저는 0을 반환합니다. 이 때문에, 0 종종 성공을 지정하는 데 사용되는 비 - 제로 값은 복귀 오류 상태를 지정하는 데 사용된다. 나는 요한의 제안에 이동하거나 출력 매개 변수를 사용합니다

  6. ==============================

    6.여러 가지 방법이 다시 VBA를 사용하여 값을 얻을 수 있습니다 :

    여러 가지 방법이 다시 VBA를 사용하여 값을 얻을 수 있습니다 :

    내 코드는 네 보여줍니다. 여기에 값을 반환하는 저장 프로 시저입니다 :

    Create PROCEDURE CheckExpedite
        @InputX  varchar(10),
        @InputY int,
        @HasExpedite int out
    AS
    BEGIN
        Select @HasExpedite = 9 from <Table>
        where Column2 = @InputX and Column3 = @InputY
    
        If @HasExpedite = 9
            Return 2
        Else
            Return 3
    End
    

    여기에 엑셀 VBA에서 서브 I의 사용이다. Microsoft ActiveX 데이터 2.8 개체 라이브러리에 당신은 참조가 필요합니다.

    Sub CheckValue()
    
        Dim InputX As String: InputX = "6000"
        Dim InputY As Integer: InputY = 2014
    
        'open connnection
        Dim ACon As New Connection
        ACon.Open ("Provider=SQLOLEDB;Data Source=<SqlServer>;" & _
            "Initial Catalog=<Table>;Integrated Security=SSPI")
    
        'set command
        Dim ACmd As New Command
        Set ACmd.ActiveConnection = ACon
        ACmd.CommandText = "CheckExpedite"
        ACmd.CommandType = adCmdStoredProc
    
        'Return value must be first parameter else you'll get error from too many parameters
        'Procedure or function "Name" has too many arguments specified.
        ACmd.Parameters.Append ACmd.CreateParameter("ReturnValue", adInteger, adParamReturnValue)
        ACmd.Parameters.Append ACmd.CreateParameter("InputX", adVarChar, adParamInput, 10, InputX)
        ACmd.Parameters.Append ACmd.CreateParameter("InputY", adInteger, adParamInput, 6, InputY)
        ACmd.Parameters.Append ACmd.CreateParameter("HasExpedite", adInteger, adParamOutput)
    
        Dim RS As Recordset
        Dim RecordsAffected As Long
    
        'execute query that returns value
        Call ACmd.Execute(RecordsAffected:=RecordsAffected, Options:=adExecuteNoRecords)
    
        'execute query that returns recordset
        'Set RS = ACmd.Execute(RecordsAffected:=RecordsAffected)
    
        'get records affected, return value and output parameter
        Debug.Print "Records affected: " & RecordsAffected
        Debug.Print "Return value: " & ACmd.Parameters("ReturnValue")
        Debug.Print "Output param: " & ACmd.Parameters("HasExpedite")
    
        'use record set here
        '...
    
        'close
        If Not RS Is Nothing Then RS.Close
        ACon.Close
    
    End Sub
    
  7. ==============================

    7.당신은 계정 아래의 예처럼 사용에 계획하는 경우에 더 나은 함수로 해제 될 수 있음.

    당신은 계정 아래의 예처럼 사용에 계획하는 경우에 더 나은 함수로 해제 될 수 있음.

    그렇지 않으면 당신은 여전히 ​​결과에 선택을 수행하여 다른 하나를 호출하여 저장 프로 시저의 결과를 얻을 수 있어야합니다.

  8. from https://stackoverflow.com/questions/749622/how-to-get-return-value-of-a-stored-procedure by cc-by-sa and MIT license