[SQL] 저장 프로 시저를 실행할 때, CommandType.Text를 사용하여 대 CommandType.StoredProcedure를 사용의 이점은 무엇인가?
SQL저장 프로 시저를 실행할 때, CommandType.Text를 사용하여 대 CommandType.StoredProcedure를 사용의 이점은 무엇인가?
그래서 C #에서 나는 다음 (생략 연결 코드)와 같은 코드가 저장 프로 시저를 사용합니다 :
string sql = "GetClientDefaults";
SqlCommand cmd = new SqlCommand(sql);
cmd.CommandType = CommandType.StoredProcedure; //<-- DO I NEED THIS??
cmd.Parameters.AddWithValue("@computerName", computerName);
어디 SQL 저장 프로 시저의 이름입니다. 자,이 코드와 주석 라인없이 잘 작동하는 것 같다.
그래서,이 줄을해야합니까? 이 설정에 약간의 성능 (또는 다른) 혜택이 있습니까? 를 설정하거나 텍스트로 설정하지 않는 이점이 있습니까?
해결법
-
==============================
1.당신이 CommandType.Text를 사용하는 SQL 서버가 sp_executesql을에 문을 감싸서, 당신을 위해 매개 변수화 할 것입니다이 블로그 게시물의 테스트에 따르면. 당신이 CommandType.StoredProcedure를 사용할 때 당신은 그것을 매개 변수화하여 데이터베이스 몇 가지 작업을 저장합니다. 후자의 방법은 빠르다.
당신이 CommandType.Text를 사용하는 SQL 서버가 sp_executesql을에 문을 감싸서, 당신을 위해 매개 변수화 할 것입니다이 블로그 게시물의 테스트에 따르면. 당신이 CommandType.StoredProcedure를 사용할 때 당신은 그것을 매개 변수화하여 데이터베이스 몇 가지 작업을 저장합니다. 후자의 방법은 빠르다.
편집하다:
설정
나는 몇 가지 검사에게 자신을 한 적이 여기 결과입니다.
이 절차를 만듭니다
create procedure dbo.Test ( @Text1 varchar(10) = 'Default1' ,@Text2 varchar(10) = 'Default2' ) as begin select @Text1 as Text1, @Text2 as Text2 end
SQL Server 프로파일 러를 사용에 대한 추적을 추가합니다.
그리고 다음 코드를 사용하여 전화 :
using System; using System.Data; using System.Data.SqlClient; namespace ConsoleApplication2 { class Program { static void Main() { CallProcedure( CommandType.Text ); CallProcedure( CommandType.StoredProcedure ); } private static void CallProcedure(CommandType commandType) { using ( SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=Test;Integrated Security=SSPI;") ) { connection.Open(); using ( SqlCommand textCommand = new SqlCommand("dbo.Test", connection) ) { textCommand.CommandType = commandType; textCommand.Parameters.AddWithValue("@Text1", "Text1"); textCommand.Parameters.AddWithValue("@Text2", "Text2"); using ( IDataReader reader = textCommand.ExecuteReader() ) { while ( reader.Read() ) { Console.WriteLine(reader["Text1"] + " " + reader["Text2"]); } } } } } } }
결과
두 경우 모두 호출은 RPC를 사용하여 만들어집니다.
여기에 추적이 사용 CommandType.Text을 알 수있는 작업은 다음과 같습니다
exec sp_executesql N'dbo.Test',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'
그리고 여기 CommandType.StoredProcedure를 사용하여 결과는 다음과 같습니다
exec dbo.Test @Text1=N'Text1',@Text2=N'Text2'
당신은 제대로 파라미터 화 될 수 있도록 텍스트 호출을 sp_executesql에 대한 호출에 싸여 볼 수 있듯이. CommandType.StoredProcedure를 사용하여 서 빠른 여전히 것을 물론이 뜻을 따라서 내 이전 문을 약간의 오버 헤드를 생성합니다.
여기에 계약 위반의 종류도 또 다른 주목할만한 것은, 그리고, 나는 기본값없이 절차를 만들 때 다음과 같은 오류를 가지고 있다는 것입니다 :
그 이유는 sp_executesql을 호출이 당신이 매개 변수를 선언하고 초기화 볼 수 있듯이, 생성,하지만 사용하지 않는 방법이다. 작업에 대한 호출 들어, 다음과 같이 봤어야 :
exec sp_executesql N'dbo.Test @Text1, @Text2',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'
당신이 CommandType.Text을 사용할 때 의미, 당신은 당신이 항상 기본 값을 사용하지 않으려면의 CommandText에 매개 변수를 추가해야합니다.
따라서, 귀하의 질문에 대답하기
-
==============================
2.큰 차이는 실제로 있습니다. 명령 유형의 StoredProcedure를 지정하는 경우 다음 당신은 당신의하는 SqlCommand에 추가하는 매개 변수는 매개 변수는 프로 시저 호출을 추가 할 것이다. 당신이 텍스트로두면 다음 매개 변수가없는 절차에 배치에 추가됩니다. 점을 설명하기 위해 더미 절차를 만들 수 있습니다 :
큰 차이는 실제로 있습니다. 명령 유형의 StoredProcedure를 지정하는 경우 다음 당신은 당신의하는 SqlCommand에 추가하는 매개 변수는 매개 변수는 프로 시저 호출을 추가 할 것이다. 당신이 텍스트로두면 다음 매개 변수가없는 절차에 배치에 추가됩니다. 점을 설명하기 위해 더미 절차를 만들 수 있습니다 :
create procedure usp_test @p1 char(10) = 'foo', @p2 int = 42 as select @p1, @p2; go
그런 다음이 작은 C # 응용 프로그램을 컴파일 :
static void Main(string[] args) { ExecWithType(CommandType.Text); ExecWithType(CommandType.StoredProcedure); } static void ExecWithType(CommandType type) { using (SqlConnection conn = new SqlConnection(Settings.Default.connString)) { conn.Open(); using (SqlCommand cmd1 = new SqlCommand("usp_test", conn)) { cmd1.CommandType = type; cmd1.Parameters.AddWithValue("@p1", "bar"); cmd1.Parameters.AddWithValue("@p2", 24); using (SqlDataReader rdr = cmd1.ExecuteReader()) { while (rdr.Read()) { Console.WriteLine("Type: {0} Result: @p1: {1} @p2: {2}", type, rdr[0], rdr[1]); } } } } }
결과는 다음과 같습니다
Type: Text Result: @p1: foo @p2: 42 Type: StoredProcedure Result: @p1: bar @p2: 24
아야! 매개 변수가 배치에 전달 된 있지만 CommandType.Text 설정의 경우, 그들은 프로 시저로 전달되지 않았다. 재미를 디버깅 많은 시간 소스 ...
-
==============================
3.당신은이 ADO.NET은 당신을 도울 수 있도록 설정합니다. 당신이 CommandType.StoredProcedure를 사용하면 저장 프로 시저의 이름을 동일 단지 넣어의 CommandText해야합니다.
당신은이 ADO.NET은 당신을 도울 수 있도록 설정합니다. 당신이 CommandType.StoredProcedure를 사용하면 저장 프로 시저의 이름을 동일 단지 넣어의 CommandText해야합니다.
예를 들어,이 :
YourSqlCommand.CommandType = CommandType.StoredProcedure; YourSqlCommand.CommandText = "dbo.YourStoredProc";
상당에인가 :
YourSqlCommand.CommandText = "exec dbo.YourStoredProc";
-
==============================
4.CommandType을은 SQL 서버에 특정하지 않습니다. 그것은 특정의 방법으로의 CommandText을 치료하는 내부 공급자를 지시에 IDbCommand 인터페이스의 속성입니다. SQL 서버는 절차대로 한 단어로 이름을 치료할 수 있지만, 당신이 다른 업체에서 일을 기 대해서는 안된다.
CommandType을은 SQL 서버에 특정하지 않습니다. 그것은 특정의 방법으로의 CommandText을 치료하는 내부 공급자를 지시에 IDbCommand 인터페이스의 속성입니다. SQL 서버는 절차대로 한 단어로 이름을 치료할 수 있지만, 당신이 다른 업체에서 일을 기 대해서는 안된다.
일반적으로, 당신은 SqlCommand를 같은 특정 클래스 대신 DbCommand 같은 공급자가 생성 한 클래스를 사용하는 것을 선호한다. 이 방법 당신은 단순히 설정 파일에서 공급자 문자열을 변경하여 다른 데이터베이스를 타겟팅 할 수 있습니다.
from https://stackoverflow.com/questions/9267078/when-executing-a-stored-procedure-what-is-the-benefit-of-using-commandtype-stor by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 이 두 합류 테이블 접근 방식의 차이? (0) | 2020.05.15 |
---|---|
[SQL] 사이베이스의 신비 '타임 스탬프'데이터 형식은 무엇입니까? (0) | 2020.05.15 |
[SQL] MySQL은 TOP에 대한 대안이 있습니까? (0) | 2020.05.15 |
[SQL] 오라클에서 DATEDIFF 함수 (0) | 2020.05.15 |
[SQL] 왜 C #을 플로트에서 SQL 플로트 다른입니다 (0) | 2020.05.15 |