[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.ParameterDirection.ReturnValue를 사용하여 매개 변수를 추가합니다. 리턴 값은 실행 후 파라미터 존재할 것이다.
ParameterDirection.ReturnValue를 사용하여 매개 변수를 추가합니다. 리턴 값은 실행 후 파라미터 존재할 것이다.
-
==============================
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.ExecuteScalar는 첫 번째 행의 첫 번째 열을 반환합니다. 당신이 선택하고 결과 집합을 만들어 더 이상 이었기 때문에이 널 (null)을 반환하고, 그 이유는 없습니다. 그냥 참고로. 존 손더스는 정답이있다.
ExecuteScalar는 첫 번째 행의 첫 번째 열을 반환합니다. 당신이 선택하고 결과 집합을 만들어 더 이상 이었기 때문에이 널 (null)을 반환하고, 그 이유는 없습니다. 그냥 참고로. 존 손더스는 정답이있다.
-
==============================
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.당신이 뭔가를 지정하지 않는 한 그냥 몇 가지 조언은하지만, 기본적으로 저장 프로 시저는 0을 반환합니다. 이 때문에, 0 종종 성공을 지정하는 데 사용되는 비 - 제로 값은 복귀 오류 상태를 지정하는 데 사용된다. 나는 요한의 제안에 이동하거나 출력 매개 변수를 사용합니다
당신이 뭔가를 지정하지 않는 한 그냥 몇 가지 조언은하지만, 기본적으로 저장 프로 시저는 0을 반환합니다. 이 때문에, 0 종종 성공을 지정하는 데 사용되는 비 - 제로 값은 복귀 오류 상태를 지정하는 데 사용된다. 나는 요한의 제안에 이동하거나 출력 매개 변수를 사용합니다
-
==============================
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.당신은 계정 아래의 예처럼 사용에 계획하는 경우에 더 나은 함수로 해제 될 수 있음.
당신은 계정 아래의 예처럼 사용에 계획하는 경우에 더 나은 함수로 해제 될 수 있음.
그렇지 않으면 당신은 여전히 결과에 선택을 수행하여 다른 하나를 호출하여 저장 프로 시저의 결과를 얻을 수 있어야합니다.
from https://stackoverflow.com/questions/749622/how-to-get-return-value-of-a-stored-procedure by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서수 위치 표기법을 사용의 장점? (0) | 2020.05.11 |
---|---|
[SQL] C #을 사용하여 SQL 데이터베이스에 날짜 시간 값을 삽입 (0) | 2020.05.11 |
[SQL] SQL Server의 지연 가능 제약 (0) | 2020.05.11 |
[SQL] LEFT와 쿼리는 0의 카운트 행을 반환하지 JOIN (0) | 2020.05.11 |
[SQL] NOT 거래 SQL에 존재하는 반대 경우를 제외하고는 사용 하는가? (0) | 2020.05.11 |