WorkaHolic/MSSQL

MSSQL SP_EXECUTESQL

2010. 4. 8. 22:09
반응형

문자열을 실행하려면 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


반응형