sp_executesql을 기본적으로 구성 / 사용할 수 있습니까?


10

SQL Server에 대해 매우 동적 인 SQL 쿼리를 사용하는 응용 프로그램을 찾고 있습니다. 매우 이상하고 복잡한 방식으로 구성된 쿼리를 보면 다른 이야기이지만, 내가 스스로를 알아낼 수없는 (너무 멍청한) 이유가 있다고 말합니다. 쿼리가 함께 포장되어 코드 sp_executesql.

그러나 추적 할 때 많은 쿼리가 래핑 된 것을 볼 수 있습니다 sp_executesql. 전체 응용 프로그램 솔루션에는 명령 sp_executesql이 전혀 포함되어 있지 않습니다 .

그래서 아직 알지 못하는 구성이 있는지 소프트웨어가 기본적으로 sp_executesql로 쿼리를 래핑 해야하는지 궁금합니다.

이 행동의 원인은 무엇입니까?

답변:


11

SQL 문이 랩핑되는 이유는 특성 sp_executesql설정 및 모든 매개 변수를 명령에 전달하기 때문입니다.SqlCommand.Commandtype

SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.StoredProcedure;                
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

위의 코드는이 T-SQL로 끝납니다.

exec proc1 @param1=1
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.Text;                
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

이 코드는 다음 T-SQL의 실행으로 끝납니다.

exec sp_executesql N'proc1',N'@param1 int',@param1=1

추가 23.12.15 :CommandType.Text 명령을 사용 하면 결과가 비슷합니다. 매개 변수가 명령 개체에 추가되면 .NET은 전체 쿼리를 래핑 sp_executesql하고 매개 변수에 전달합니다.

추가 :sp_executesql .NET 클래스 의이 동작을 더 깊이 파고 들인 후 매개 변수 스니핑 및 계획 캐싱은 높은 빈도의 쿼리 컴파일 및 계획 수를 피하기 위해 완전히 의미가 있습니다. 따라서 기본적으로 SQL Server 성능을 전반적으로 향상 시키도록 설계되었지만 동시에 생성 된 초기 쿼리 계획과 다른 매개 변수 값으로 사용되는 일부 쿼리 (매개 변수 스니핑 문제)의 성능이 저하 될 수 있습니다.

보다:

위 샘플은 .NET Framework 4.5 및 SQL Server 2008 Developer Edition을 사용하여 작성되었습니다.


5

이것이 .NET 응용 프로그램 인 경우 SqlCommand.ExecuteReader () 가 호출 된 결과 일 가능성이 큽니다 . 기본 SqlCommand 클래스 페이지 에 따르면 "설명"섹션의 메서드 설명 표에있는 ExecuteReader 아래에 다음과 같이 나와 있습니다.

행을 반환하는 명령을 실행합니다. 성능 향상을 위해 ExecuteReader는 Transact-SQL sp_executesql 시스템 저장 프로 시저를 사용하여 명령을 호출합니다 . 따라서 ExecuteReader는 Transact-SQL SET 문과 같은 명령을 실행하는 데 원하는 효과를 얻지 못할 수 있습니다.

설명을 확인하기 위해 이것을 테스트 할 시간이 없지만 매우 간단한 호출을 수행하고 일부 쿼리 텍스트를 전달하며와 함께 제공되는 매개 변수를 포함하는 간단한 콘솔 응용 프로그램을 만드는 것은 쉽습니다 SqlParameter. 내 생각 엔 것입니다 ExecuteNonQueryExecuteScalar사용할 수도 sp_executesql그들은 또한 매개 변수 전달이 가능하기 때문에 왜 사람들이 실행하는 방법에 대한 다른 경로가있을 것이다, 그래서?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.