SQL - 동적SQL/정적SQL 차이점과 예시 (MS-SQL, MySQL)

 

정적 SQL (Static SQL)

  • 고정된 방식으로 작성되고 실행되는 SQL문
  • SQL문은 프로그램이 실행되기 전에 정의
  • 데이터나 다른 변수의 변화에 영향을 받지 않음
  • 일반적으로 DB에 의해 최적화되고 사전 컴파일될 수 있기 때문에 동적 SQL보다 효율적
  • 예시
    • 전체 멤버 조회
SELECT * FROM member;


동적 SQL (Dynamic SQL)

  • 프로그램이 실행되는(런타임) 동안 생성되고 실행되는 SQL문
  • 데이터나 다른 변수에 따라 변경될 수 있는 변수를 사용하여 구성
  • 런타임까지 SQL 쿼리의 특성을 알 수 없는 상황에서 유용
  • 정적 SQl보다 SQL 쿼리의 유연성과 더 넓은 범위의 조건과 상황을 처리 할 수 있는 사용자 정의가 향상
  • 아래 예시는 간단한 예시이며 실제로는 좀 더 복잡함
  • 예시
    • 인천에 사는 멤버 조회

 

MS-SQL

  • sp_executesql
    • 동적 SQL문을 실행하는데 사용되는 Microsoft SQL Server의 시스템 저장 프로시저
    • MySQL에서는 사용 불가
    • 반드시 유니코드형 문자열(N')로 입력
    • 코드 설명
      • @sql 변수에 쿼리를 작성, 실행 될 쿼리(@sql)안의 매개 변수의 타입 지정, 매개 변수의 값
      • 출력을 원할 경우 매개 변수 지정하는 두번째 파라미터에 OUTPUT을 기재하여 값을 반환
--  MS-SQL
DECLARE @sql NVARCHAR(MAX), @columnValue VARCHAR(50)

SET @columnValue = 'incheon';

SET @sql = N'SELECT * FROM member where address = @columnValue';

EXEC sp_executesql @sql, N'@columnValue VARCHAR(50)', @columnValue;

-- 반환 값을 받을 경우, 예) 출력되는 행의 수 반환
-- SET @sql = N'SELECT count(*) FROM member where address = @columnValue';
-- EXEC sp_executesql @sql, N'@columnValue VARCHAR(50), @result INT OUTPUT', @columnValue, @result OUTPUT;
-- SELECT @result; >>> 1


MySQL

  • PREPARE : SQL문을 준비하고 나중에 명령문(@sql)을 참조할 이름(stmt) 지정
  • EXECUTE : 참조한 이름(stmt)의 SQL문을 실행
  • DEALLOCATE PREPARE : 준비된 SQL문을 할당 해제
-- MySQL
SET @columnValue = 'incheon';

SET @sql = CONCAT('SELECT * FROM member WHERE address = ''', @columnValue, '''');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


참고

Microsoft SQL Documentation - Using sp_executesql

 

sp_executesql 사용

문자열을 실행하려면 EXECUTE 문 대신 sp_executesql 저장 프로시저를 사용하는 것이 좋습니다. sp_executesql 저장 프로시저는 매개 변수 대체를 지원하므로 EXECUTE보다 융통성이 뛰어납니다. 또한 sp_execut

learn.microsoft.com

 

MySQL Reference Manual - Prepared Statements

 

MySQL :: MySQL 5.7 Reference Manual :: 13.5 Prepared Statements

13.5 Prepared Statements MySQL 5.7 provides support for server-side prepared statements. This support takes advantage of the efficient client/server binary protocol. Using prepared statements with placeholders for parameter values has the following benefi

dev.mysql.com