SP_ExecuteSQL SAMPLE

USE PUBS


--SP_EXECUTESQL 프로시서 사용법--
/*
구문
sp_executesql [@stmt =] stmt
[
     {, [@params =] N'@parameter_name  data_type [,...n]' }
     {, [@param1 =] 'value1' [,...n] }
]



인수
[@stmt =] stmt


Transact-SQL문 또는 일괄 처리를 포함한 유니코드 문자열입니다.
stmt는 암시적으로 ntext로 변환될 수 있는 변수 또는 유니코드 상수여야 합니다.
 + 연산자로 두 개의 문자열을 연결한 식 등과 같은 보다 복잡한 유니코드식은 사용할 수 없습니다.
문자 상수도 사용할 수 없습니다. 상수가 지정된 경우에는 N이라는 접두사가 있어야 합니다.
예를 들어, N'sp_who'라는 유니코드 상수는 사용할 수 있지만 'sp_who'는 사용할 수 없습니다. 문
자열의 크기는 사용 가능한 데이터베이스 서버의 메모리의 용량에 따라서만 제한됩니다.


stmt는 변수 이름과 동일한 형식의 매개 변수를 포함할 수 있습니다. 예를 들면 다음과 같습니다.








N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'


stmt에 포함된 각 매개 변수에는 @params 매개 변수 정의 목록과 매개 변수 값 목록 모두에 해당되는 항목이 있어야 합니다.


[@params =] N'@parameter_name  data_type [,...n]'


stmt에 포함된 모든 매개 변수의 정의를 포함하는 하나의 문자열입니다. 문자열은 암시적으로 ntext로 변환될 수 있는 변수 또는 유니코드 상수여야 합니다. 각 매개 변수의 정의는 매개 변수 이름과 데이터 형식으로 구성됩니다. n은 추가 매개 변수 정의를 나타내는 자리 표시자입니다. stmt에서 지정된 모든 매개 변수는 반드시 @params에서 정의되어야 합니다. stmt의 Transact-SQL문 또는 일괄 처리에 매개 변수가 없는 경우에는 @params가 필요하지 않습니다. 이 매개 변수의 기본값은 NULL입니다.


[@param1 =] 'value1'


매개 변수 문자열에서 정의된 첫번째 매개 변수의 값입니다. 값은 상수 또는 변수가 될 수 있습니다. stmt에 포함된 모든 매개 변수에 대해 제공되는 매개 변수 값이 있어야 합니다. stmt의 Transact-SQL문 또는 일괄 처리에 매개 변수가 없는 경우에는 값이 필요하지 않습니다.


n


추가 매개 변수의 값에 대한 자리 표시자입니다. 값은 상수 또는 변수만 가능합니다. 값은 함수 또는 연산자를 사용하여 작성된 표현식 등과 같이, 보다 복잡한 표현식이 될 수 없습니다.
*/


--사용하는 예를 보면 다음과 같습니다. 인자가 없는 SQL문 실행


Declare @strSQL nvarchar(200) --우선 선언을 합니다.(유니코드 형식이라서 NVARCHAR 형으로 선언합니다. VARCHAR로 선언하면 에러가 납니다.)
Set @strSQL=N'Select * from titles' --SQL문을 strSQL에 대입합니다. 이때 유니코드화 할수 있는 N 키를 사용합니다.
execute sp_executesql @strSQL --프로시저를 생합니다.



Declare @SQL nvarchar(200)  --쿼리의 값을 선언합니다. 
Declare @ParmDefinition nvarchar(100) --인자의 형식을 선언합니다. 여기선 NVARCHAR(100)으로 선언했습니다. 숫자면 INT로 하면 되겠죠?
Declare @ret_titleid nvarchar(100)  --책자 코드를 변수로 하기 위해 지정 하였습니다.


Set @SQL=N'Select * from titles where title_id=@title_id' --실제 책자 코드는..@title_id입니다. 나중에 @ret_titleid를 인자로 받습니다.
Set @ParmDefinition=N'@title_id varchar(80)'   --직업 대입합니다.
Set @titleid='bu1032'     --인자에도 대입을 합니다.
Execute sp_executesql @SQL, @ParmDefinition,   --실행하면 끝.
 @title_id = @titleid



go



--이 아래의 예를 MSDN의 예를 그대로 사용한 것입니다.


DECLARE @IntVariable INT
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)


/* Build the SQL string once.*/
SET @SQLString =
     N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = @level'
SET @ParmDefinition = N'@level tinyint'
/* Execute the string with the first parameter value. */
SET @IntVariable = 35
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @level = @IntVariable
/* Execute the same string with the second parameter value. */
SET @IntVariable = 32
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @level = @IntVariable


/*
이 프로시저를 이용할 경우 프로시저에서 여러형태의 쿼리를 동적으로 생성할시
유효한 결과를 출력할수 있습니다.
다시 말하면 SQL문등을 IF문등의 제어하여 결과물을 유도할수 있다는 얘깁니다.
*/


예제)



Alter Proc GetTitle
@qty nvarchar(3),
@price nvarchar(20),
@stor_id nvarchar(4)
as
Declare @SQL nvarchar(200)
Set @SQL='Select T.title_id,T.title,T.price,S.stor_id,S.qty  '
Set @SQL=@SQL + ' from Titles as T inner join Sales as S  '
Set @SQL=@SQL + ' on T.title_id=S.title_id  '
Set @SQL=@SQL + ' where S.qty > ' + @qty
 if (@price != '')
                  begin
  Set @SQL=@SQL + '  and T.price > ' + @price
                  end
 if (@stor_id != '')
                  begin
  Set @SQL=@SQL + '  and S.stor_id = ''' +  @stor_id + '''' ----------------1)
                  end
Select @SQL


Execute Sp_executesql @SQL ------------------------------2)
go


/*
위 문장을 보면 무척 복잡해 보일수도 있다.
사실 복잡하기도 하다 위 문장을 이해 하기 위해서는
프로시저와 T-SQL문을 알고 있어야 한다.
실무에서는 이러한 문장이 빈번히 사용되지는 않지만..
꼭 사용해야 할 경우가 있다.
그럴때 한번을 위해서 위와 같은 문장이 유효한 것이다.
Declare 은 VB, ASP의 DIM과 같은 역활을 한다.
그냥 선언을 위해 사용된다.
그리고 각 선언들이 NVARCHAR 로 정의 된 이유는 위에서 설명 되어 졌다.
--(너무 불친절 한거 같아서 여기서 설명한다. sp_executesql은 유니코드로 변환 가능한 상태여야만
    하기 때문에..nvarchar로 정의 되어 지며 int, money numeric 등을 따로 정의 할 필요는 없다.
    어차피 sp_exeuctesql을 사용하지전에 문장이 숫자와 문자의 구분이 되어 지기 때문이다.
   위 문장의 2) 대신 Select @SQL 로 바꾸어 보면 이유를 알수 있다.
*/


--Tips...
--SQL문에서 위에 2) 에서 ==>  '  and S.stor_id = ''' +  @stor_id + ''''  에서 혿따움표가 네개임을 알수 있다.
--왜~~ 4개여야만 하는가... 그건 문자임을 나타내는 '@stor_id' 로 나타내는 것과 같다.
--아래를 실행해 보자....
Select ''
 --아무것도 나타나지 않을것이다.
Select ''''
 --앗 혼따움표가 4개인데...결과는 하나가 나타났다..
Select ''''''
 --이번엔 2개가 나타났다.
Select ''''''''
 --이번엔 3개가 나타났다..
--이 처럼 Select 할때 혿따움표 2개가 하나를 나타내는 것이다...


--위 프로시저를 결과는 아래를 실행하면 알수 있다.


Exec GetTitle '1','10.00', '6380' -- qty가 1 이상이고, 10.00달라보다 큰가격의 상점 아이디 6380의 결과치를 가져올것이다.


--만약 상점 아이디가 6380 이 아닌 전부를 가져 오겠다면..


Exec GetTitle '1','10.00', ''-- 이를 실행하면 아래의 문장을 실행하는 것과 같다. if 문에서  @stor_id !='' 로서 걸려지기 때문이다.


Select T.title_id,T.title,T.price,S.stor_id,S.qty   from Titles as T inner join Sales as S   on T.title_id=S.title_id  
where S.qty > 1  and T.price > 10.00
--이 두 문장(프로시저와 SQL 쿼리)는 똑같은 결과를 가져 온다.


이상 sp_executesql 문의 유용한 용법과 사용 설명이었습니다.
--by Vins~~~