다음을 통해 공유


저장 프로시저 실행(데이터베이스 엔진)

저장 프로시저를 실행하려면 Transact-SQL EXECUTE 문을 사용합니다. 또는 저장 프로시저가 일괄 처리의 첫 번째 문이면 EXECUTE 키워드를 사용하지 않고 저장 프로시저를 실행할 수 있습니다.

시스템 저장 프로시저 실행

시스템 저장 프로시저는 **sp_**로 시작합니다. 시스템 확장 저장 프로시저는 물리적으로 리소스 데이터베이스에 저장되지만 논리적으로는 SQL Server 인스턴스의 모든 시스템 정의 데이터베이스와 사용자 정의 데이터베이스의 sys 스키마에 나타납니다. 저장 프로시저 이름을 완전히 한정하지 않고도 모든 데이터베이스에서 시스템 저장 프로시저를 실행할 수 있습니다. 스키마가 한정되지 않은 이름은 sp_someproc와 같이 한 부분으로 된 이름이거나 somedb..sp_someproc와 같이 세 부분으로 된 이름입니다. 세 부분으로 된 이름에서 두 번째 부분은 스키마 이름이며 지정하지 않습니다.

이름 충돌이 발생하지 않도록 sys 스키마 이름으로 모든 시스템 저장 프로시저 이름을 스키마로 한정하는 것이 좋습니다. 다음 예에서는 권장되는 시스템 저장 프로시저 실행 방법을 설명합니다.

EXEC sys.sp_who;

다음 예에서는 이전 버전과 호환되는 시스템 저장 프로시저 실행 방법을 설명합니다.

[!참고]

다음과 같은 시스템 저장 프로시저 실행 방법은 나중 버전의 SQL Server에서 제거됩니다. 향후 개발 작업에서는 이러한 방법을 사용하지 않도록 하고 현재 이러한 방법을 사용하는 응용 프로그램은 수정하십시오.

EXEC sp_who;
EXEC master.dbo.sp_who;
EXEC mydatabase..sp_who;
EXEC dbo.sp_who;
EXEC mydatabase.dbo.sp_who;

데이터베이스 데이터 정렬 일치

SQL Server 2008에서는 시스템 프로시저 이름을 일치시킬 때 호출 데이터베이스 데이터 정렬을 사용합니다. 따라서 응용 프로그램에서 대/소문자를 구분하여 시스템 프로시저 이름을 항상 정확하게 지정해야 합니다. 예를 들어 다음 코드는 대/소문자 구분 데이터 정렬을 사용하는 데이터베이스 컨텍스트에서 실행할 경우 실패합니다.

exec SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help 

정확한 시스템 저장 프로시저 이름을 표시하려면 sys.system_objectssys.system_parameters 카탈로그 뷰를 사용합니다.

시스템 확장 저장 프로시저 실행

시스템 확장 저장 프로시저는 **xp_**로 시작합니다. 시스템 확장 저장 프로시저는 물리적으로 리소스 데이터베이스에 저장되지만 논리적으로는 SQL Server 인스턴스의 모든 시스템 정의 데이터베이스와 사용자 정의 데이터베이스의 sys 스키마에 나타납니다. 다음 예에서는 권장되는 시스템 확장 저장 프로시저 실행 방법을 설명합니다.

EXEC sys.xp_subdirs 'c:\';

사용자 정의 저장 프로시저 실행

사용자 정의 저장 프로시저 또는 함수 등의 모듈이나 일괄 처리에서 사용자 정의 저장 프로시저를 실행할 경우 적어도 하나의 스키마 이름으로 저장 프로시저 이름을 한정하는 것이 좋습니다.

다음 예에서는 권장되는 사용자 정의 저장 프로시저 실행 방법을 설명합니다.

USE AdventureWorks;
GO
EXEC dbo.uspGetEmployeeManagers 50;

또는

EXEC AdventureWorks.dbo.uspGetEmployeeManagers 50;
GO

정규화되지 않은 사용자 정의 저장 프로시저를 지정하면 데이터베이스 엔진은 다음 순서로 프로시저를 검색합니다.

  • 현재 데이터베이스의 sys 스키마

  • 일괄 처리나 동적 SQL에서 실행된 경우 호출자의 기본 스키마. 또는 다른 프로시저 정의 본문에 한정되지 않은 프로시저 이름이 있는 경우 이 다른 프로시저를 포함하는 스키마가 다음으로 검색됩니다. 기본 스키마에 대한 자세한 내용은 사용자와 스키마 분리를 참조하십시오.

  • 현재 데이터베이스의 dbo 스키마

중요 정보중요

사용자가 만든 저장 프로시저와 시스템 저장 프로시저의 이름이 같을 경우 스키마가 한정되지 않은 이름 참조를 사용하면 사용자가 만든 저장 프로시저가 실행되지 않습니다. 자세한 내용은 저장 프로시저 만들기(데이터베이스 엔진)를 참조하십시오.

매개 변수 지정

매개 변수 값을 받아들이도록 저장 프로시저를 작성하면 매개 변수 값을 입력할 수 있습니다.

입력하는 매개 변수 값은 상수나 변수여야 하며 함수 이름을 지정할 수 없습니다. 변수는 @@spid와 같은 시스템 변수이거나 사용자 정의 변수일 수 있습니다.

다음 예에서는 저장 프로시저 uspGetWhereUsedProductID에 매개 변수 값을 전달하는 방법을 설명합니다. 프로시저에는 두 입력 매개 변수(제품 ID와 날짜)에 대한 값이 필요합니다. 다음 예에서는 상수와 변수로 매개 변수를 전달하는 방법과 변수를 사용하여 함수 값을 전달하는 방법을 설명합니다.

USE AdventureWorks;
GO
-- Passing values as constants.
EXEC dbo.uspGetWhereUsedProductID 819, '20050225';
GO
-- Passing values as variables.
DECLARE @ProductID int, @CheckDate datetime;
SET @ProductID = 819;
SET @CheckDate = '20050225';
EXEC dbo.uspGetWhereUsedProductID @ProductID, @CheckDate;
GO
-- Try to use a function as a parameter value.
-- This produces an error message.
EXEC dbo.uspGetWhereUsedProductID 819, GETDATE();
GO
-- Passing the function value as a variable.
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

저장 프로시저에서 정의된 순서가 아닌 다른 순서로 매개 변수를 지정하려면 매개 변수의 이름을 지정해야 합니다. 자세한 내용은 매개 변수 이름 지정를 참조하십시오.

매개 변수가 반드시 호출 프로그램으로 값을 반환하도록 지정하려면 OUTPUT 키워드를 사용합니다. 자세한 내용은 매개 변수 방향 지정을 참조하십시오.

매개 변수의 순서 지정

**@parameter =**value 형식을 사용하면 매개 변수를 아무 순서로나 지정할 수 있습니다. 기본값이 제공되는 경우 매개 변수를 생략할 수도 있습니다. 한 매개 변수를 **@parameter =**value 형식으로 지정하면 다음에 나오는 모든 매개 변수도 이 형식으로 지정해야 합니다. 매개 변수를 **@parameter =**value 형식으로 지정하지 않을 경우 CREATE PROCEDURE 문에 지정된 순서대로 매개 변수를 지정해야 합니다.

저장 프로시저를 실행할 때 프로시저를 만드는 과정에서 매개 변수 목록에 포함되지 않은 매개 변수는 서버에서 거부됩니다. 매개 변수 이름을 명시적으로 전달하여 참조에 의해 전달되는 매개 변수의 경우 이름이 일치하지 않으면 거부됩니다.

매개 변수에 기본값 사용

기본값이 제공되는 경우 매개 변수를 생략할 수 있지만 실제로는 매개 변수 목록을 잘라내는 것입니다. 예를 들어 저장 프로시저에 매개 변수가 5개 있는 경우 매개 변수를 **@parameter =**value 형식으로 지정하지 않으면 4번째 및 5번째 매개 변수를 모두 생략할 수 있지만 4번째 매개 변수를 생략하고 5번째 매개 변수를 포함할 수는 없습니다.

저장 프로시저의 매개 변수에 기본값이 정의되어 있으면 다음과 같은 경우 기본값이 사용됩니다.

  • 저장 프로시저를 실행할 때 매개 변수 값을 지정하지 않을 경우

  • 매개 변수 값으로 DEFAULT 키워드를 지정하는 경우