동적 SQL - EXEC(@SQL) 대 EXEC SP_EXECUTSQL(@SQL)
SQL Server의 저장 프로시저에서 동적 SQL 명령을 실행할 때의 실제 장점과 단점은 무엇입니까?
EXEC (@SQL)
대
EXEC SP_EXECUTESQL @SQL
?
sp_executesql
쿼리 계획 재사용을 촉진할 가능성이 높습니다.사용 시sp_executesql
매개 변수는 호출 서명에서 명시적으로 식별됩니다.이 훌륭한 기사는 이 과정을 설명합니다.
동적 SQL의 여러 측면에 대해 자주 인용되는 참조는 Erland Sommarskog의 "동적 SQL의 저주와 축복"을 읽어야 합니다.
SP_EXECUTSQL의 중요한 점은 매개 변수화된 쿼리를 만들 수 있다는 것입니다. SQL 주입에 관심이 있는 경우 매우 유용합니다.
Microsoft의 Using sp_executesql 문서에서는 다음을 사용할 것을 권장합니다.sp_executesql
대신에execute
진술.
이 저장 프로시저는 매개 변수 대체를 지원하므로 sp_executesql은 EXECUTE보다 더 유용하며 sp_executesql은 SQL Server에서 재사용될 가능성이 높은 실행 계획을 생성하므로 sp_executesql이 EXECUTE보다 더 효율적입니다.
그래서, 요점은: 진술을 사용하지 말라는 것입니다.사용하다sp_executesql
.
저는 요즘 항상 sp_executesql을 사용합니다. 실제로는 매개 변수와 변수를 처리하는 EXEC의 래퍼입니다.
그러나 매우 큰 데이터베이스에서 쿼리를 조정할 때, 특히 둘 이상의 데이터베이스에 걸쳐 데이터가 있고 인덱스 검색을 제한하기 위해 제약 조건을 사용하는 경우에는 OPTION Recompile을 잊지 마십시오.
OPTION RECOMFILE을 사용하지 않는 한 SQL 서버는 쿼리에 대해 "one size fit all" 실행 계획을 만들고 실행할 때마다 전체 인덱스 검사를 실행합니다.
이는 검색보다 훨씬 덜 효율적이며 쿼리하지도 않는 범위로 제한된 전체 인덱스를 검색할 수 있음을 의미합니다.@
- 변수 선언
- 명령에 따라 설정하고 sp 매개 변수 값 사용과 같은 동적 요소를 추가합니다(여기서 @IsMonday 및 @IsTuesday는 spparam입니다).
명령을 실행합니다.
declare @sql varchar (100) set @sql ='select * from #td1' if (@IsMonday+@IsTuesday !='') begin set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )' end exec( @sql)
언급URL : https://stackoverflow.com/questions/548090/dynamic-sql-execsql-versus-exec-sp-executesqlsql
'programing' 카테고리의 다른 글
What's the PostgreMySQL AUTOINCREMENT와 동일한 SQL 데이터 유형? (0) | 2023.05.31 |
---|---|
트랜잭션 관리자가 원격/네트워크 트랜잭션에 대한 지원을 사용하지 않도록 설정했습니다. (0) | 2023.05.26 |
Mongoose 문서를 일반 객체로 변환하려면 어떻게 해야 합니까? (0) | 2023.05.26 |
로컬 분기 삭제 실행 취소 (0) | 2023.05.26 |
이전에 추가한 라이브러리 제거 또는 제거: cocoapods (0) | 2023.05.26 |