MSSQL - sp_executesql 사용법, [Error] 프로시저에 'ntext/nchar/nvarchar' 유형의 매개 변수 '@statement'이(가) 필요합니다.

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'이(가) 필요합니다.
*/

<MSSQL 메시지에 에러의 내용이 출력된 화면>


원인 파악

이 에러가 왜 발생하는지를 알려면 우선 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'

<sp_executesql, 유니코드 문자열로 변경하여 실행한 화면>


파라미터가 변수일 경우

  • 변수의 타입을 유니코드가 지원되는 데이터타입으로 선언
  • 에러 발생 쿼리 데이터 타입 : 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

<sp_executesql, 유니코드를 지원하는 데이터타입의 변수를 사용하여 쿼리를 실행한 화면>


참고