보시다시피 "이유"질문에는 역사적 근거와 언어에 대한 기본 가정을 포함하여 다른 종류의 답변이 필요합니다.
SQL MVP Erland Sommarskog의이 포괄적 인 기사는 메커니즘과 함께 몇 가지 이론적 근거를 제공하려고 시도합니다.
동적 SQL의 저주와 축복 :
쿼리 계획 캐싱
SQL Server에서 실행하는 모든 쿼리에는 쿼리 계획이 필요합니다. 쿼리를 처음 실행할 때 SQL Server는 쿼리 계획을 작성하거나 용어에 따라 쿼리를 컴파일합니다. SQL Server는 계획을 캐시에 저장하고 다음에 쿼리를 실행할 때 계획이 재사용됩니다.
이것이 (그리고 보안, 아래 참조) 아마도 가장 큰 이유 일 것입니다.
SQL은 쿼리가 일회성 작업이 아니라 계속 사용된다는 전제 하에서 작동합니다. 테이블 (또는 데이터베이스!)이 실제로 쿼리에 지정되어 있지 않으면 나중에 사용할 수 있도록 실행 계획을 생성하고 저장할 수 없습니다.
예, 우리가 실행하는 모든 쿼리가 재사용되는 것은 아니지만 이것이 SQL의 기본 운영 전제 이므로 "예외"는 예외적입니다.
Erland가 나열하는 몇 가지 다른 이유 ( 저장 프로 시저 사용의 장점을 명시 적으로 나열 하고 있지만 매개 변수화 된 (비 동적) 쿼리의 장점이기도합니다)
- 권한 시스템 : SQL 엔진은 조작 할 테이블 (또는 데이터베이스)을 모르는 경우 쿼리를 실행할 권한이 있는지 여부를 예측할 수 없습니다. 동적 SQL을 사용하는 "권한 체인"은 문제가 많습니다.
- 네트워크 트래픽 줄이기 : 저장된 proc의 이름과 몇 개의 매개 변수 값을 네트워크를 통해 전달하는 것은 긴 쿼리 문보다 짧습니다.
- 캡슐화 로직 : 다른 프로그래밍 환경에서 로직을 캡슐화하는 이점에 익숙해야합니다.
- 사용 된 내용 추적 : 열 정의를 변경해야하는 경우이를 호출하는 모든 코드를 어떻게 찾을 수 있습니까? 시스템 프로시 저는 SQL 데이터베이스 내에서 종속성을 찾기 위해 존재하지만 코드가 저장 프로 시저에있는 경우에만 존재합니다.
- SQL 코드 작성 용이성 : 저장 프로 시저를 만들거나 수정할 때 구문 검사가 발생하므로 오류가 거의 발생하지 않습니다.
- 버그 및 문제 해결 : DBA는 변화하는 동적 SQL보다 훨씬 쉽게 개별 저장 프로 시저의 성능을 추적하고 측정 할 수 있습니다.
다시, 이것들 각각은 내가 여기에 들어 가지 않을 백 개의 뉘앙스를 가지고 있습니다.