반응형
정적 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
MySQL Reference Manual - Prepared Statements
반응형