본문 바로가기
DataBase/MsSql

Dynamic SQL 사용법 및 example Query

by 아우럼 2024. 5. 10.
반응형

Dynamic SQL은 전달된 입력 매개변수를 기반으로 런타임에 SQL 문이 만들어지고 실행되는 매우 유용하게 사용하는 SQL 문입니다.

Dynamic SQL 특징

  • Dynamic SQL은 SQL 쿼리를 조건에 따라서 문자열로 만들어 런타임에 동적으로 실행하는 프로그램 방법입니다.
  • 프로그램에서 요청하는 변수의 값을 이용하여 Query 문을 동적으로 작성할 수 있습니다.
  • Dynamic SQL은 Query를 단순화시킬 수 있고 개발 소스의 양을 줄일 수 있습니다.
  • Dynamic SQL 문자열은 EXEC, EXECUTE, sp_executesql을 이용하여 실행합니다.

Dynamic SQL 사용 방법

DML 문에 대한 Dynamic SQL 사용법.

  • 문자열 변수에 DML 문을 만든 후 Dynamic SQL 실행합니다.
DROP TABLE IF EXISTS InfoForDynamicSql;
CREATE TABLE InfoForDynamicSql (
    UserId int,
    UserNm varchar(255) NOT NULL,
    UserAge  int    NULL,
   UserAddress varchar(500)   NULL
);
INSERT INTO dbo.InfoForDynamicSql(UserId,UserNm) 
VALUES (272, N'Ken')
      ,(273, N'Brian')
      ,(274, N'Stephen')
      ,(275, N'Michael')
      ,(276, N'Linda');

--DML 문에 대한 Dynamic SQL  
DECLARE @dynamicSQL nvarchar(max),
        @_userId nvarchar(200) ,
        @_userAddress  nvarchar(200) 

-- assign values
set @_userId = CAST(272 as nvarchar(200));
set @_userAddress = CAST('New York in USA ' as nvarchar(200));
  
-- build dynamic upate statement
SET @dynamicSQL = ' update InfoForDynamicSql SET UserAddress = ''' 
                  + @_userAddress 
                  + ''' WHERE UserId = ' 
                  +  @_userId ; 

print(@dynamicSQL);
--execute dynamic statement
execute(@dynamicSQL);

저장 프로시저의 Dynamic SQL 사용법.

  • PROCEDURE에서 문자열 변수에 DML 문을 만든 후 실행합니다. 단, 파라미터 변수를 외부에서 받아서 처리해 보세요.
--저장 프로시저의 Dynamic SQL 
CREATE PROCEDURE ProcedureFordynamicSQL(
	@userId int,
	@userAddress nvarchar(200) 
)
AS
BEGIN
	DECLARE @dynamicSQL nvarchar(max),
            @_userId nvarchar(200) ,
            @_userAddress  nvarchar(200)
	-- assign values
	set @_userId = CAST(@userId as nvarchar(200));
	set @_userAddress = CAST(@userAddress as nvarchar(200)); 
	 
	SET @dynamicSQL = ' update InfoForDynamicSql SET UserAddress = ''' 
	                  + @_userAddress +  ''' WHERE UserId = ' +  @_userId ; 
	print(@dynamicSQL);
	--execute dynamic statement
	execute(@dynamicSQL)
END;

EXECUTE ProcedureFordynamicSQL 273,'seoul the korea';


DDL 문에 대한 Dynamic SQL 사용법.

  • Dynamic SQL 이용하여 테이블을 삭제하고 생성하는 DDL 문을 실행합니다.
--DDL 문에 대한 Dynamic SQL SQL
DECLARE @dynamicSQL nvarchar(max),
        @tablename nvarchar(50),
        @columnsInfo varchar(200);

SET @tablename = 'dbo.InfoForDynamicSql'
SET @columnsInfo  = '(
    UserId int,
    UserNm varchar(255) NOT NULL,
    UserAge  int    NULL,
    UserAddress varchar(500) NULL
) ';

SET @dynamicSQL = N' DROP TABLE IF EXISTS ' + @tablename + ' ; '
SET @dynamicSQL += N' CREATE TABLE ' + @tablename + @columnsInfo + ' ; '

EXECUTE(@dynamicSQL);

PROCEDURE에서 sp_executesql을 사용하여 Dynamic SQL 사용법.

  • Dynamic SQL을 PROCEDURE에 만들고 실행은 sp_executesql을 이용하세요.
--sp_executesql을 사용하여 Dynamic SQL 실행
ALTER PROCEDURE PRO_dynamicSqlForSp_executesql 
  @ParamUserId    INT,
  @ParamUserNm    VARCHAR(100),
  @ParamUserAge   INT, 
  @ParamAddress   varchar(500) 
AS  
DECLARE @dynamicSQL NVARCHAR(500);
DECLARE @ParmDefinition NVARCHAR(500);  
  
SET @dynamicSQL = ' INSERT INTO  dbo.InfoForDynamicSql ' 
                    + ' ( UserId,UserNm,UserAge, UserAddress  ) '; 						 
 
SET @dynamicSQL += ' VALUES ( @StmtParamUserId, @StmtParamUserNm, @StmtParamUserAge,@StmtParamAddress);'                  

SET @ParmDefinition =  N'@StmtParamUserId    INT,
                         @StmtParamUserNm    VARCHAR(100),
                         @StmtParamUserAge   INT,
                         @StmtParamAddress    VARCHAR(500)
';
 
EXECUTE sp_executesql @dynamicSQL,  @ParmDefinition,
@ParamUserId,
@ParamUserNm,
@ParamUserAge,
@ParamAddress
  
--  EXECUTE  
EXECUTE PRO_dynamicSqlForSp_executesql
@ParamUserId = '200', 
@ParamUserNm = 'mikle', 
@ParamUserAge = 10,
@ParamAddress = 'La'
;


sp_executesql의 OUTPUT 매개변수 이용하여 Dynamic SQL 실행.

  • Dynamic SQL의 OUTPUT을 sp_executesql을 이용하여 실행합니다.
-- OUTPUT 매개 변수 사용.
DECLARE @dynamicSQL NVARCHAR(500);  
DECLARE @ParmDefinition NVARCHAR(500);  
DECLARE @OutPutUserName NVARCHAR(25);  
DECLARE @IntVariable INT;  

SET @dynamicSQL = N'SELECT @UserNmOUT = MAX(UserNm)  
	FROM InfoForDynamicSql  
	WHERE UserId = @ParamUserId ';  

SET @ParmDefinition = N'@ParamUserId             INT,  
                        @UserNmOUT NVARCHAR(25)  OUTPUT 
                       ';  
	  
EXECUTE sp_executesql  
     @dynamicSQL  
    ,@ParmDefinition  
    ,@ParamUserId = 200  
    ,@UserNmOUT =  @OutPutUserName OUTPUT;  

-- SELECT Data.  
SELECT @OutPutUserName  AS OutPutUserName;

Dynamic Sql 사용법 예제 설명 입니다.
Dynamic Sql 사용법 설명 입니다.

Dynamic SQL 장점, 단점은?

Dynamic SQL 사용의 장점.

  • Dynamic SQL은 유용하게 Query를 작성할 수 있습니다.
  • Dynamic SQL은 패턴이 있는 Query를 작성할 때 간단하게 할 수 있습니다.

Dynamic SQL 사용의 단점.

  • 에러 발생 시 디버깅이 어렵습니다.
  • 정적 SQL과 비교해서 소스 파악이 어렵습니다.
  • 문자열을 연결해서 사용할 때 보안 문제를 일으킬 수 있습니다.
  • MSSQL 서버는 Dynamic SQL을 실행할 때마다 실행 계획을 생성해야 하므로 정적 SQL과 비교해 성능 저하가 있을 수 있습니다.
반응형