반응형
Error)
동적 쿼리를 실행하려는데 작성한 sql문을 실행하니 다음과 같은 에러가 출력되었다.
아래는 이해를 돕기 위해 쿼리문을 간소화 시켜 에러를 발생한 예시 구문이다.
exec sp_executesql 'select 1'
/* 에러 내용
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 [Batch Start Line 182]
프로시저에 'ntext/nchar/nvarchar' 유형의 매개 변수 '@statement'이(가) 필요합니다.
*/
원인 파악
이 에러가 왜 발생하는지를 알려면 우선 sp_executesql 프로시저에 대해 이해를 해야한다.
sp_executesql 란?
- sp_executesql 는 MSSQL 에서 사용되는 저장 프로시저 중 하나이다.
- 여러 번 다시 사용할 수 있는 SQL 쿼리문 또는 일괄 처리 또는 동적 쿼리를 실행하는 기능을 한다.
- SQL 쿼리문 또는 일괄 처리에는 매개 변수가 포함될 수 있다.
- 쉽게 말하자면, 사전에 정의한 쿼리문을 문자열로 저장해서 일괄적으로 실행하기 위해 사용한다.
* 저장 프로시저 : 하나 이상의 SQL 쿼리문 그룹을 일괄적으로 처리하기 위한 것
sp_executesql의 파라미터에 대해
sp_executesql의 파라미터는 SQL 쿼리문 또는 일괄 처리가 포함된 유니코드 문자열이여야 한다.즉, 유니코드 상수 또는 유니코드 변수를 사용해야 한다는 의미이다.
- 유니코드 상수의 경우 : N 접두사 지정 (N 접두사는 유니코드 문자열을 의미한다.)
- 유니코드 변수의 경우 : 유니코드가 허용되는 데이터 타입 사용 (nvarchar, nchar, ntext)
해결 방법
sp_executesql의 인자(파라미터)는 유니코드로 구성되어야 한다는 것을 알게 되었다.
이제 직접적으로 쿼리가 실행되게끔 고쳐서 쿼리가 실행되는지 확인해보자.
기존 에러 발생 쿼리문
- 문자열을 사용한 쿼리문 실행 (상수)
exec sp_executesql 'select 1'
-- 에러 발생
정상 실행되도록 수정한 쿼리문
- 문자열을 유니코드 문자열로 변경하도록 N 접두사 사용
exec sp_executesql N'select 1'
파라미터가 변수일 경우
- 변수의 타입을 유니코드가 지원되는 데이터타입으로 선언
- 에러 발생 쿼리 데이터 타입 : varchar
- 정상 실행되도록 수정한 데이터 타입 : nvarchar
- nvarchar, nchar, ntext의 n은 N 접두사와 마찬가지로 유니코드를 지원한다는 의미를 갖는다.
-- 에러가 발생하는 쿼리문 예시 : 변수의 데이터 타입을 varchar로 정의
declare @sql varchar(max)
set @sql = 'select 1'
-- sql 쿼리 실행
exec sp_executesql @sql
/* [ 에러 발생 ]
* Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 [Batch Start Line 181]
* 프로시저에 'ntext/nchar/nvarchar' 유형의 매개 변수 '@statement'이(가) 필요합니다.
*/
-- 정상 실행되도록 수정한 쿼리문 예시 : 변수의 데이터 타입을 nvarchar로 정의
declare @sql nvarchar(max)
set @sql = 'select 1'
-- sql 쿼리 실행
exec sp_executesql @sql
참고
반응형