문자열을 실행하려면 EXECUTE 문 대신 sp_executesql을 사용하는 것이 좋습니다.
sp_executesql은 매개 변수 대체를 지원하므로 EXECUTE보다 융통성이 뛰어납니다.
또한 sp_executesql은 SQL Server 2005 에서 재사용이 쉬운 실행 계획을 생성하므로 EXECUTE 문보다 효율적입니다.
sp_executesql은 Transact-SQL 문자열에 지정된 매개 변수의 매개 변수 값 대체를 지원하지만 EXECUTE 문은 지원하지 않습니다.
그러므로 sp_executesql로 생성된 Transact-SQL 문자열은 EXECUTE 문으로 생성된 것보다 더 비슷합니다.
SQL Server 쿼리 최적화 프로그램은 sp_executesql의 Transact-SQL 문을 이전에 실행된 문의 실행 계획과 비교하여 새 실행 계획을 컴파일해야 하는 오버헤드를 줄입니다.
sp_executesql는 EXECUTE와 같은 작업을 수행하지만 다음과 같은 추가 이점이 있습니다.
1. Transact-SQL 문의 실제 텍스트는 실행 간에 변경되지 않으므로 쿼리 최적화 프로그램은 두 번째 실행의 Transact-SQL 문을 첫 번째 실행에서 생성된 실행 계획과 비교해야 합니다. 이에 따라 SQL Server 에서 두 번째 문을 컴파일할 필요가 없습니다.
2. Transact-SQL 문자열이 한 번만 작성됩니다.
3. 정수 매개 변수는 자신의 기본 형식으로 지정됩니다. 유니코드로 변환되지 않아도 됩니다.
UNICODE 문자열 상수를 지정할 때는 N`...`형식을 사용한다.
sp_executesql은 sql로 구성된 시스템 프로시저가 아니라 확장 프로시저이다.
sp_executesql [@stmt =] stmt
[
{, [@params =] N`@parameter_name data_type [,...n]` }
{, [@param1 =] `value1` [,...n] }
]
[인수설명]
@stmt: T-SQL문 또는 배치 명령. ntext 형으로 변환될 수 있는 변수 또는 유니코드 상수 문자열. 내부에 @name 형식의 파라미터를 포함할 수 있다.
@params: @stmt에 포함된 모든 파라미터의 이름과 데이터 타입을 정의한다.
@param1: @params 파라미터에서 첫번째 파라미터에 할당할 값
n : 각 파라미터에 대한 값을 할당한다.
지원이 안되는 것들은 다음과 같다
1.동적 SQL문에서는 RETURN 문을 사용할 수 없다
2.로컬 변수를 액세스 할 수 없다
3. 현재 데이터베이스가 변경되지 않는다
<예제>
set @strQuery = `select ` + @strFields + ` from ` + @strTables + @strFilterCriteria + @strGroupCriteria + @strSortCriteria
exec sp_executesql @strQuery
------- 단순 예제 --------
declare @cnt as nvarchar(5)
declare @stmt as nvarchar(100)
set @cnt = `5`
set @stmt = `select top ` + @cnt + ` * from northwind.dbo.orders`
exec sp_executesql @stmt
---------- 둘 이상의 쿼리를 배치로 실행 -----------
declare @stmt as nvarchar(500)
set @stmt = `use northwind; `
set @stmt = @stmt + `select top 5 * from dbo.orders where
orderid=10248; `
set @stmt = @stmt + `select top 5 * from dbo.[order details] where
orderid=10248`
exec sp_executesql @stmt
----- 입력파라미터를 적용한 예제 ----------
use northwind
declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
set @stmt = `select productid, quantity, unitprice from `
set @stmt = @stmt + `dbo.[order details] where orderid=@orderid`
set @params = `@orderid int`
exec sp_executesql @stmt, @params, @orderid=10248
------------ OUTPUT 파라미터 적용한 예제 ----------
use northwind
declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
declare @orderret as int
set @stmt = `select @ordercnt = count(*) from dbo.orders`
set @params = `@ordercnt as int OUTPUT` -- OUTPUT 키워드에 주의. 여기도 OUTPUT 키워드를 지정한다.
exec sp_executesql @stmt, @params, @ordercnt = @orderret OUTPUT
-- 확인
select @orderret
[출처] SP_EXECUTESQL|작성자 leeoh04