[MSSQL] 동적쿼리 (EXEC) 실행 결과 가져오기 (EXEC SP_EXECUTESQL)




동적쿼리의 프로시저 작성 중

일반 프로그래밍 언어처럼 어떠한 실행 결과값을 변수로 남기고 싶었습니다.

오랜 고민 끝에 두 가지 해결책이 나왔는데요,


    1) 실행 결과값을 TABLE 변수에 저장

    2) EXEC SP_EXECUTESQL

이번 포스팅에서는 SP_EXECUTESQL 사용법에 대해 다뤄보겠습니다.


[코드]

BEGIN

 DECLARE @RESULT INT;      -- 결과값을 담을 지역 변수

 DECLARE @NUM1 INT = 10;      
 DECLARE @NUM2 INT = 20;

 DECLARE @SQL  NVARCHAR(MAX) ='';  -- [주의] NVARCHAR 타입을 가져야함.
 DECLARE @SQL_VAR NVARCHAR(MAX) ='';


 -- [실행 SQL의 내부 변수 선언]
 SET @SQL_VAR = N'@V_RESULT FLOAT OUTPUT';  

 -- [실행할 SQL 정의]
 SET @SQL = N'SELECT @V_RESULT = ' + CONVERT(VARCHAR, @NUM1) + '+' + CONVERT(VARCHAR, @NUM2);


 EXEC SP_EXECUTESQL @SQL, @SQL_VAR,     -- 설정한 SQL, Variable 
      @V_RESULT =  @RESULT OUTPUT; -- Variable 값을 반환 받음 (Variable -> 지역변수)

 PRINT @SQL
 PRINT @RESULT

END

[결과]


✱ 변수 설명

1) @RESULT : 실행 시키고자하는 SQL의 결과값을 받기 위한 변수입니다.

2) @NUM1, @NUM2 : 동적 쿼리로 변하는 변수를 표현합니다.

3) @SQL : 실행 시키고자 하는 SQL을 NVARCHAR 형태로 저장합니다.
           (이 때, SP_EXECUTESQL에서 NVARCHAR를 요구하므로 VARCHAR로 선언하는 실수를 하지 않도록 합시다.)

4) @SQL_VAR : @SQL에 정의한 변수 정의





✱ 추가 설명

더불어 이해를 돕기위해 설명하자면,

1. 실행할 SQL(@SQL)과 실행 SQL에서 RETURN 값을 저장할 변수 정의(@SQL_VAR)

2. SP_EXECUTE 실행의 경우 많이 헷갈리는 부분이 마지막 PARAMETER로

   [SQL결과값] = [반환받을 변수] OUTPUT

   순서로 정의된 다는 것입니다.


저는 동적 쿼리 개발 당시 위 기법으로 특정 테이블들의 집계함수 결과값들을 가져와
프로시저 쿼리 내부에서 사용하는 방향으로 사용했습니다.



(혹여, 가독성 및 용어와 같은 불편하신점 있으시다면 코멘트 남겨주시면 감사하겠습니다.🌝)

1 댓글

  1. 실무에서 도움이 됐습니다. 감사합니다

    답글삭제