EXECUTE(Transact-SQL)
적용 대상:Microsoft Fabric의 Microsoft Fabric SQL 데이터베이스에 있는 Microsoft Fabric Warehouse의 SQL Server Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)SQL 분석 엔드포인트
Transact-SQL 일괄 처리 내에서 또는 시스템 저장 프로시저, 사용자 정의 저장 프로시저, CLR 저장 프로시저, 스칼라 반환 사용자 정의 함수, 확장 저장 프로시저 등과 같은 모듈 중 하나에서 명령 문자열이나 문자열을 실행합니다.
EXEC
또는 EXECUTE
문을 사용하여 연결된 서버에 통과 명령을 보낼 수 있습니다. 또한 문자열이나 명령이 실행되는 컨텍스트를 명시적으로 설정할 수도 있습니다. 결과 집합에 대한 메타데이터는 WITH RESULT SETS
옵션을 사용하여 정의할 수 있습니다.
중요
문자열을 사용하여 EXECUTE
호출하기 전에 문자열의 유효성을 검사합니다. 유효성을 검사하지 않은 사용자 입력에서 생성된 명령을 실행하지 마세요.
구문
다음 코드 블록은 SQL Server 2019(15.x) 이상 버전의 구문을 보여 줍니다. 대신 SQL Server 2017 이하에서의 구문을 참조하셔도 됩니다.
SQL Server 2019 이상 버전에 대한 구문입니다.
-- Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
[ ; ]
-- Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { LOGIN | USER } = ' name ' ]
[ ; ]
-- Execute a pass-through command against a linked server
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]
[ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]
)
[ AS { LOGIN | USER } = ' name ' ]
[ AT linked_server_name ]
[ AT DATA_SOURCE data_source_name ]
[ ; ]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
<result_sets_definition> ::=
{
(
{ column_name
data_type
[ COLLATE collation_name ]
[ NULL | NOT NULL ] }
[,...n ]
)
| AS OBJECT
[ db_name . [ schema_name ] . | schema_name . ]
{table_name | view_name | table_valued_function_name }
| AS TYPE [ schema_name.]table_type_name
| AS FOR XML
}
다음 코드 블록은 SQL Server 2017(14.x) 및 이전 버전의 구문을 보여 줍니다. 대신 SQL Server 2019에서의 구문을 참조하셔도 됩니다.
SQL Server 2017 및 이전 버전의 구문입니다.
-- Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
[ ; ]
-- Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { LOGIN | USER } = ' name ' ]
[ ; ]
-- Execute a pass-through command against a linked server
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]
[ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]
)
[ AS { LOGIN | USER } = ' name ' ]
[ AT linked_server_name ]
[ ; ]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
<result_sets_definition> ::=
{
(
{ column_name
data_type
[ COLLATE collation_name ]
[ NULL | NOT NULL ] }
[,...n ]
)
| AS OBJECT
[ db_name . [ schema_name ] . | schema_name . ]
{table_name | view_name | table_valued_function_name }
| AS TYPE [ schema_name.]table_type_name
| AS FOR XML
}
In-Memory OLTP에 대한 구문입니다.
-- Execute a natively compiled, scalar user-defined function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name | @module_name_var }
[ [ @parameter = ] { value
| @variable
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
<execute_option>::=
{
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
Azure SQL Database에 대한 구문입니다.
-- Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH RECOMPILE ]
}
[ ; ]
-- Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { USER } = ' name ' ]
[ ; ]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
<result_sets_definition> ::=
{
(
{ column_name
data_type
[ COLLATE collation_name ]
[ NULL | NOT NULL ] }
[,...n ]
)
| AS OBJECT
[ db_name . [ schema_name ] . | schema_name . ]
{table_name | view_name | table_valued_function_name }
| AS TYPE [ schema_name.]table_type_name
| AS FOR XML
}
Azure Synapse Analytics 및 병렬 데이터 웨어하우스에 대한 구문입니다.
-- Execute a stored procedure
[ { EXEC | EXECUTE } ]
procedure_name
[ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ]
[ ; ]
-- Execute a SQL string
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )
[ ; ]
Microsoft Fabric의 구문입니다.
-- Execute a stored procedure
[ { EXEC | EXECUTE } ]
procedure_name
[ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ]
[ WITH <execute_option> [ ,...n ] ] }
[ ; ]
-- Execute a SQL string
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )
[ ; ]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
인수
@return_status
모듈의 반환 상태를 저장하는 선택적 정수 변수입니다. 이 변수는 EXECUTE
문에서 사용되기 전에 일괄 처리, 저장 프로시저 또는 함수에서 선언해야 합니다.
스칼라 반환 사용자 정의 함수를 호출하는 데 사용되는 경우 @return_status 변수는 모든 스칼라 데이터 형식일 수 있습니다.
module_name
호출할 저장 프로시저 또는 스칼라 반환 사용자 정의 함수의 정규화되거나 정규화되지 않은 이름입니다. 모듈 이름은 식별자 규칙을 따라야 합니다. 확장 저장 프로시저의 이름은 서버의 데이터 정렬에 관계없이 항상 대/소문자를 구분합니다.
모듈을 실행하는 사용자가 모듈을 소유하거나 해당 데이터베이스에서 해당 모듈을 실행할 적절한 권한이 있는 경우 다른 데이터베이스에서 만든 모듈을 실행할 수 있습니다. SQL Server를 실행하고 있는 다른 서버에서 모듈을 실행하려면 모듈을 실행하는 사용자가 원격 액세스를 통해 서버에 연결하여 해당 데이터베이스에서 모듈을 실행할 수 있는 적절한 사용 권한을 갖고 있어야 합니다. 서버 이름은 지정했지만 데이터베이스 이름은 지정하지 않은 경우 SQL Server 데이터베이스 엔진은 사용자의 기본 데이터베이스에서 모듈을 찾습니다.
;number
같은 이름의 프로시저를 그룹화하는 데 사용되는 선택적 정수입니다. 이 매개 변수는 확장 저장 프로시저에 사용되지 않습니다.
참고 항목
SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.
프로시저 그룹에 대한 자세한 내용은 CREATE PROCEDURE참조하세요.
@module_name_var
모듈 이름을 나타내는 로컬로 정의된 변수의 이름입니다.
이것은 고유하게 컴파일된 스칼라 사용자 정의 함수의 이름을 담는 변수일 수 있습니다.
@parameter
모듈에 정의된 module_name매개 변수입니다. 매개 변수 이름 앞에는 at sign(@
)이 와야 합니다.
@parameter_name = 값 양식과 함께 사용하는 경우 매개 변수 이름과 상수를 모듈에서 정의한 순서대로 제공할 필요가 없습니다. 그러나 @parameter_name = 값 폼이 매개 변수에 사용되는 경우 모든 후속 매개 변수에 사용해야 합니다.
기본적으로 매개 변수에 Null이 허용됩니다.
value
모듈 또는 통과 명령에 전달할 매개 변수의 값입니다. 매개 변수 이름을 지정하지 않으면 모듈에 정의된 순서대로 매개 변수 값을 제공해야 합니다.
연결된 서버에 대해 통과 명령을 실행하는 경우 연결된 서버의 OLE DB 공급자에 따라 매개 변수 값의 순서가 달라집니다. 대부분의 OLE DB 공급자는 값을 왼쪽에서 오른쪽으로 매개 변수에 바인딩합니다.
매개 변수 값이 개체 이름이거나 문자열인 경우 또는 데이터베이스 이름이나 스키마 이름으로 한정되는 경우에는 반드시 전체 이름을 작은따옴표로 묶어야 합니다. 매개 변수 값이 키워드인 경우에는 반드시 큰따옴표로 키워드를 묶어야 합니다.
@
시작하지 않는 단일 단어를 전달하는 경우(예: 매개 변수 이름에 @
잊어버린 경우) 따옴표로 묶지 않은 단어는 따옴표가 누락되어도 nvarchar 문자열로 처리됩니다.
기본값이 모듈에서 정의된 경우 사용자가 매개 변수를 지정하지 않고 모듈을 실행할 수 있습니다.
기본값은 NULL
수 있습니다. 일반적으로 모듈 정의는 매개 변수 값이 NULL
경우 수행해야 하는 작업을 지정합니다.
@variable
매개 변수 또는 반환 매개 변수를 저장하는 변수입니다.
OUTPUT
모듈이나 명령 문자열에서 매개 변수를 반환하도록 지정합니다. 모듈 또는 명령 문자열에서 일치하는 매개 변수도 키워드 OUTPUT
사용하여 만들어야 합니다. 커서 변수를 매개 변수로 사용할 때 이 키워드를 사용합니다.
값 연결된 서버에 대해 실행되는 모듈의 OUTPUT
정의된 경우 OLE DB 공급자가 수행하는 해당 @parameter 대한 변경 내용은 모듈 실행이 끝날 때 변수에 다시 복사됩니다.
OUTPUT
매개 변수를 사용하고 호출 일괄 처리 또는 모듈 내의 다른 문에서 반환 값을 사용하려는 경우 매개 변수 값은 @parameter = @variable같은 변수로 전달되어야 합니다. 모듈에서 OUTPUT
매개 변수로 정의되지 않은 매개 변수의 OUTPUT
지정하여 모듈을 실행할 수 없습니다. 상수는 OUTPUT
사용하여 모듈에 전달할 수 없습니다. 반환 매개 변수에는 변수 이름이 필요합니다. 프로시저를 실행하기 전에 변수의 데이터 형식이 선언되어야 하며 값이 할당되어야 합니다.
원격 저장 프로시저에 대해 EXECUTE
사용하거나 연결된 서버에 대해 통과 명령을 실행하는 경우 OUTPUT
매개 변수는 LOB(큰 개체) 데이터 형식 중 하나일 수 없습니다.
반환 매개 변수에는 LOB 데이터 형식을 제외한 모든 데이터 형식을 사용할 수 있습니다.
DEFAULT
모듈에 정의된 매개 변수의 기본값을 제공합니다. 모듈에 정의된 기본값이 없고 매개 변수가 없거나 DEFAULT
키워드가 지정된 매개 변수에 대한 값이 필요한 경우 오류가 발생합니다.
@string_variable
지역 변수의 이름입니다. @string_variable 모든 char, varchar, nchar또는 nvarchar 데이터 형식일 수 있습니다. 여기에는 (max) 데이터 형식이 포함됩니다.
[N]'tsql_string'
상수 문자열입니다.
tsql_string은 nvarchar 또는 varchar 데이터 형식이 될 수 있습니다.
N
포함된 경우 문자열은 nvarchar 데이터 형식으로 해석됩니다.
AS context_specification
문이 실행될 컨텍스트를 지정합니다.
LOGIN
가장할 컨텍스트를 로그인으로 지정합니다. 가장의 범위는 서버입니다.
USER
가장할 컨텍스트를 현재 데이터베이스의 사용자로 지정합니다. 가장의 범위는 현재 데이터베이스로 제한됩니다. 데이터베이스 사용자로 컨텍스트 전환은 해당 사용자의 서버 수준 권한을 상속하지 않습니다.
중요
컨텍스트가 데이터베이스 사용자로 전환되는 동안 데이터베이스 외부의 리소스에 액세스하려고 하면 문이 실패합니다. 여기에는 3부 또는 4부로 구성된 식별자를 사용하여 다른 데이터베이스를 참조하는 USE <database>
문, 분산 쿼리 및 쿼리가 포함됩니다.
'name'
유효한 사용자 또는 로그인 이름입니다. 이름 인수는 각각 sysadmin 고정 서버 역할의 멤버이거나 sys.database_principals 또는 sys.server_principals보안 주체로 존재해야 합니다.
이 인수는 NT AUTHORITY\LocalService
, NT AUTHORITY\NetworkService
또는 NT AUTHORITY\LocalSystem
같은 기본 제공 계정이 될 수 없습니다.
자세한 내용은 이 문서의 뒷부분에 있는 사용자 또는 로그인 이름 지정을 참조하세요.
[N]'command_string'
연결된 서버에 전달할 명령을 포함하는 상수 문자열입니다.
N
포함된 경우 문자열은 nvarchar 데이터 형식으로 해석됩니다.
[?]
<arg-list>
문에 사용되는 통과 명령의 EXECUTE ('...', <arg-list>) AT <linkedsrv>
값이 제공되는 매개 변수를 나타냅니다.
AT linked_server_name
command_string이 linked_server_name에 대해 실행되고 결과(있을 경우)가 클라이언트로 반환되도록 지정합니다. linked_server_name은 로컬 서버의 기존 연결된 서버 정의를 참조해야 합니다. 연결된 서버는 sp_addlinkedserver를 사용하여 정의합니다.
WITH <execute_option>
가능한 실행 옵션은 아래와 같습니다.
RESULT SETS
옵션은INSERT...EXECUTE
문에 지정할 수 없습니다.
AT DATA_SOURCE data_source_name
적용 대상: SQL Server 2019(15.x) 이상 버전.
command_string이 data_source_name에 대해 실행되고 결과(있을 경우)가 클라이언트로 반환되도록 지정합니다.
data_source_name 데이터베이스의 기존 EXTERNAL DATA SOURCE
정의를 참조해야 합니다. SQL Server를 가리키는 데이터 원본만 지원됩니다. 또한 컴퓨팅 풀을 가리키는 SQL Server 빅 데이터 클러스터 데이터 원본의 경우 데이터 풀 또는 스토리지 풀이 지원됩니다. 데이터 원본은 CREATE EXTERNAL DATA SOURCE를 사용하여 정의됩니다.
WITH <execute_option>
가능한 실행 옵션은 아래와 같습니다.
RESULT SETS
옵션은INSERT...EXECUTE
문에 지정할 수 없습니다.용어 정의 RECOMPILE
모듈을 실행한 후 새 계획을 컴파일하고 사용한 다음 삭제하도록 합니다. 모듈에 대한 기존 쿼리 계획이 있는 경우 이 계획은 캐시에 유지됩니다.
제공하는 매개 변수가 비정형이거나 데이터가 크게 변경된 경우 이 옵션을 사용합니다. 이 옵션은 확장 저장 프로시저에 사용되지 않습니다. 비용이 많이 들기 때문에 이 옵션을 사용하지 않는 것이 좋습니다.
참고:WITH RECOMPILE
구문을 사용하는 저장 프로시저를 호출할 때는OPENDATASOURCE
사용할 수 없습니다. 네 부분으로 된 개체 이름을 지정하면WITH RECOMPILE
옵션이 무시됩니다.
참고:RECOMPILE
고유하게 컴파일된 스칼라 사용자 정의 함수에서는 지원되지 않습니다. 다시 컴파일해야 하는 경우 sp_recompile사용합니다.RESULT SETS UNDEFINED
이 옵션은 반환되는 결과(있는 경우)를 보장하지 않으며 정의가 제공되지 않습니다. 어떤 결과가 반환되거나 결과가 반환되지 않는 경우에도 이 문은 오류 없이 실행됩니다. result_sets_option 제공되지 않은 경우 RESULT SETS UNDEFINED
기본 동작입니다.
해석된 스칼라 사용자 정의 함수 및 고유하게 컴파일된 스칼라 사용자 정의 함수의 경우 함수가 결과 집합을 반환하지 않으므로 이 옵션은 작동하지 않습니다.
적용 대상: SQL Server 2012(11.x) 이상 버전 및 Azure SQL Database.RESULT SETS NONE
EXECUTE
문이 결과를 반환하지 않도록 보장합니다. 결과가 반환되는 경우 일괄 처리가 중단됩니다.
해석된 스칼라 사용자 정의 함수 및 고유하게 컴파일된 스칼라 사용자 정의 함수의 경우 함수가 결과 집합을 반환하지 않으므로 이 옵션은 작동하지 않습니다.
적용 대상: SQL Server 2012(11.x) 이상 버전 및 Azure SQL Database.<result_sets_definition>
result_sets_definition
지정된 대로 결과가 다시 반환되도록 보장합니다. 여러 결과 집합을 반환하는 문의 경우 result_sets_definition 섹션을 여러 개 제공합니다. 각각의 result_sets_definition를 괄호로 묶고 쉼표로 구분합니다. 자세한 내용은 이 문서의 뒷부분에<result_sets_definition>
참조하세요.
이 옵션에서는 함수가 결과 집합을 반환하지 않기 때문에 고유하게 컴파일된 스칼라 사용자 정의 함수에 대해 항상 오류를 냅니다.
적용 대상: SQL Server 2012(11.x) 이상 버전 및 Azure SQL Database.<result_sets_definition>
실행된 문에서 반환된 결과 집합을 설명합니다.result_sets_definition
절에는 다음과 같은 의미가 있습니다.용어 정의 { column_name data_type
[ COLLATE collation_name ]
[NULL | NOT NULL] }다음 표를 참조하세요. db_name 테이블, 뷰 또는 테이블 반환 함수를 포함하는 데이터베이스의 이름입니다. schema_name 테이블, 뷰 또는 테이블 반환 함수를 소유하는 스키마의 이름입니다. table_name | view_name | table_valued_function_name 반환되는 열이 명명된 테이블, 뷰 또는 테이블 반환 함수에 지정된 열임을 지정합니다. 테이블 변수, 임시 테이블 및 동의어는 AS 개체 구문에서 지원되지 않습니다. AS TYPE [ schema_name. ]table_type_name 반환되는 열이 테이블 형식에 지정된 열임을 지정합니다. AS FOR XML EXECUTE
문에서 호출된 문 또는 저장 프로시저의 XML 결과가SELECT ... FOR XML ...
문에서 생성된 것처럼 형식으로 변환되도록 지정합니다. 원래 문의 형식 지시문에서 모든 서식이 제거되고 반환된 결과는 형식 지시문이 지정되지 않은 것처럼 표시됩니다. AS FOR XML은 실행된 문이나 저장 프로시저에서 XML이 아닌 테이블 형식 결과를 XML로 변환하지 않습니다.용어 정의 column_name 각 열의 이름입니다. 열의 개수가 결과 집합과 다른 경우 오류가 발생하고 일괄 처리가 중단됩니다. 열의 이름이 결과 집합과 다른 경우 반환된 열 이름이 정의된 이름으로 설정됩니다. data_type 각 열의 데이터 형식입니다. 데이터 형식이 다른 경우 정의된 데이터 형식으로 암시적 변환을 수행합니다. 변환에 실패하는 경우 일괄 처리가 중단됩니다. COLLATE collation_name 각 열의 데이터 정렬입니다. 데이터 정렬이 일치하지 않으면 암시적 데이터 정렬이 시도됩니다. 데이터 정렬이 실패하는 경우 일괄 처리가 중단됩니다. NULL | NOT NULL 각 열의 null 허용 여부입니다. 정의된 null 허용 여부가 NOT NULL
반환된 데이터에 null이 포함된 경우 오류가 발생하고 일괄 처리가 중단됩니다. 지정하지 않으면 기본값은ANSI_NULL_DFLT_ON
및ANSI_NULL_DFLT_OFF
옵션의 설정을 준수합니다.실행 중에 반환되는 실제 결과 집합은 결과 집합 수, 열 수, 열 이름, null 허용 여부 및 데이터 형식 중 하나로
WITH RESULT SETS
절을 사용하여 정의된 결과와 다를 수 있습니다. 결과 집합의 수가 다른 경우 오류가 발생하고 일괄 처리가 중단됩니다.
설명
매개 변수는 값 사용하거나 @parameter_name = 값사용하여 제공할 수 있습니다. 매개 변수는 트랜잭션의 일부가 아닙니다. 따라서 나중에 롤백되는 트랜잭션에서 매개 변수가 변경되면 매개 변수 값이 이전 값으로 되돌아 가지 않습니다. 호출자에게 반환되는 값은 항상 모듈이 반환되는 시점의 값입니다.
한 모듈에서 다른 모듈을 호출하거나 CLR(공용 언어 런타임) 모듈, 사용자 정의 유형 또는 집계를 참조하여 관리 코드를 실행하면 중첩이 발생합니다. 중첩 수준은 호출된 모듈 또는 관리 코드 참조가 실행을 시작할 때 증가하며 호출된 모듈 또는 관리 코드 참조가 완료되면 감소합니다. 최대값인 32 중첩 수준을 초과하면 전체 호출 체인이 실행되지 않습니다. 현재 중첩 수준은 @@NESTLEVEL
시스템 함수에 저장됩니다.
원격 저장 프로시저 및 확장 저장 프로시저는 트랜잭션 범위 내에 있지 않으므로(BEGIN DISTRIBUTED TRANSACTION
문 내에서 실행되거나 다양한 구성 옵션과 함께 사용되는 경우 제외) 호출을 통해 실행되는 명령은 롤백할 수 없습니다. 자세한 내용은
커서 변수를 사용하는 경우 커서 변수에 할당된 커서 변수를 전달하는 프로시저를 실행하면 오류가 발생합니다.
문이 일괄 처리의 첫 번째 문인 경우 모듈을 실행할 때 EXECUTE
키워드를 지정할 필요가 없습니다.
CLR 저장 프로시저에 대한 자세한 내용은 CLR 저장 프로시저참조하세요.
저장 프로시저와 함께 EXECUTE 사용
문이 일괄 처리의 첫 번째 명령문인 경우 저장 프로시저를 실행할 때 EXECUTE
키워드를 지정할 필요가 없습니다.
SQL Server 시스템 저장 프로시저는 sp_
문자로 시작합니다.
Resource Database물리적으로 저장되지만 논리적으로 모든 시스템 및 사용자 정의 데이터베이스의 sys 스키마에 나타납니다. 시스템 저장 프로시저를 일괄 처리에서 실행하거나 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 실행할 때는 저장 프로시저 이름을 sys 스키마 이름으로 한정하는 것이 좋습니다.
SQL Server 시스템 확장 저장 프로시저는 xp_
문자로 시작하며 master
데이터베이스의 dbo 스키마에 포함됩니다. 일괄 처리 또는 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 시스템 확장 저장 프로시저를 실행하는 경우 저장 프로시저 이름을 master.dbo
한정하는 것이 좋습니다.
사용자 정의 저장 프로시저를 일괄 처리에서 실행하거나 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 실행할 때는 저장 프로시저 이름을 스키마 이름으로 한정하는 것이 좋습니다. 시스템 저장 프로시저와 이름이 같은 사용자 정의 저장 프로시저의 이름을 지정하지 않는 것이 좋습니다. 저장 프로시저 실행에 대한 자세한 내용은저장 프로시저 실행
문자열과 함께 EXECUTE 사용
SQL Server에서는 문자열에 최대 2GB의 데이터를 사용할 수 있는 varchar(max) 및 nvarchar(max) 데이터 형식을 지정할 수 있습니다.
데이터베이스 컨텍스트의 변경 내용은 EXECUTE
문이 끝날 때까지만 지속합니다. 예를 들어 이 다음 문의 EXECUTE
실행되면 데이터베이스 컨텍스트가 master
.
USE master;
EXECUTE ('USE AdventureWorks2022; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');
컨텍스트 전환
AS { LOGIN | USER } = '<name>'
절을 사용하여 동적 문의 실행 컨텍스트를 전환할 수 있습니다. 컨텍스트 전환이 EXECUTE ('string') AS <context_specification>
으로 지정된 경우 컨텍스트 전환 기간은 실행될 쿼리의 범위로 제한됩니다.
사용자 또는 로그인 이름 지정
AS { LOGIN | USER } = '<name>'
지정된 사용자 또는 로그인 이름은 각각 sys.database_principals
또는 sys.server_principals
보안 주체로 존재해야 합니다. 그렇지 않으면 문이 실패합니다. 또한 보안 주체에 IMPERSONATE
권한을 부여해야 합니다. 호출자가 데이터베이스 소유자이거나 sysadmin 고정 서버 역할의 멤버가 아니면 사용자가 Windows 그룹 멤버 자격을 통해 SQL Server의 데이터베이스 또는 인스턴스에 액세스하는 경우에도 보안 주체가 있어야 합니다. 예를 들어 다음과 같은 조건을 가정해 보세요.
CompanyDomain\SQLUsers
그룹은Sales
데이터베이스에 액세스할 수 있습니다.CompanyDomain\SqlUser1
SQLUsers
멤버이므로Sales
데이터베이스에 암시적으로 액세스할 수 있습니다.
CompanyDomain\SqlUser1
SQLUsers
그룹의 멤버 자격을 통해 데이터베이스에 액세스할 수 있지만 EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1'
데이터베이스에 보안 주체로 존재하지 않으므로 문 CompanyDomain\SqlUser1
실패합니다.
모범 사례
문이나 모듈에 정의된 작업을 수행하는 데 필요한 최소한의 권한이 있는 로그인이나 사용자를 지정합니다. 예를 들어 데이터베이스 수준 권한만 필요한 경우 서버 수준 권한이 있는 로그인 이름을 지정하지 마세요. 또는 해당 권한이 필요하지 않은 한 데이터베이스 소유자 계정을 지정하지 마세요.
사용 권한
EXECUTE
문을 실행하는 데 권한이 필요하지 않습니다. 그러나 EXECUTE
문자열 내에서 참조되는 보안 개체에 대한 사용 권한이 필요합니다. 예를 들어 문자열에 INSERT
문이 포함된 경우 EXECUTE
문의 호출자에게 대상 테이블에 대한 INSERT
권한이 있어야 합니다.
EXECUTE
문이 모듈 내에 포함되어 있더라도 EXECUTE
문이 발생할 때 사용 권한이 확인됩니다.
모듈에 대한 권한을 EXECUTE
기본값은 모듈 소유자로 설정되며, 사용자는 모듈을 다른 사용자에게 전송할 수 있습니다. 문자열을 실행하는 모듈이 실행될 때는 모듈을 만든 사용자의 컨텍스트가 아니라 모듈을 실행하는 사용자의 컨텍스트에서 사용 권한 검사가 수행됩니다. 그러나 동일한 사용자가 호출 모듈을 소유하고 호출되는 모듈이 있는 경우 EXECUTE
권한 검사는 두 번째 모듈에 대해 수행되지 않습니다.
모듈이 다른 데이터베이스 개체에 액세스하는 경우 모듈에 대한 EXECUTE
권한이 있고 다음 조건 중 하나가 true이면 실행이 성공합니다.
모듈은
EXECUTE AS USER
또는EXECUTE AS SELF
표시되고 모듈 소유자는 참조된 개체에 대한 해당 권한을 가집니다. 모듈 내의 가장에 대한 자세한 내용은 EXECUTE AS 절참조하세요.모듈은
EXECUTE AS CALLER
표시되며 개체에 대한 해당 권한이 있습니다.모듈은
EXECUTE AS <user_name>
표시되고<user_name>
개체에 대한 해당 권한이 있습니다.
컨텍스트 전환 권한
로그인에 EXECUTE AS
지정하려면 호출자에게 지정된 로그인 이름에 대한 IMPERSONATE
권한이 있어야 합니다. 데이터베이스 사용자에 EXECUTE AS
지정하려면 호출자에게 지정된 사용자 이름에 대한 IMPERSONATE
권한이 있어야 합니다. 실행 컨텍스트가 지정되지 않았거나 EXECUTE AS CALLER
지정된 경우 IMPERSONATE
권한이 필요하지 않습니다.
예제: SQL Server
이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022
홈페이지에서 다운로드할 수 있는 AdventureWorksDW2022
또는 샘플 데이터베이스를 사용합니다.
A. EXECUTE를 사용하여 단일 매개 변수 전달
uspGetEmployeeManagers
AdventureWorks2022 데이터베이스의 저장 프로시저에는 하나의 매개 변수(@EmployeeID
)가 필요합니다. 다음 예에서는 매개 변수 값으로 uspGetEmployeeManagers
을 사용하여 Employee ID 6
저장 프로시저를 실행합니다.
EXECUTE dbo.uspGetEmployeeManagers 6;
GO
변수는 실행 시 명시적으로 명명될 수 있습니다.
EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
일괄 처리 또는 sqlcmd 스크립트의 첫 번째 문인 경우 EXECUTE
필요하지 않습니다.
dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
B. 여러 매개 변수 사용
다음 예제에서는 AdventureWorks2022 spGetWhereUsedProductID
데이터베이스에서 저장 프로시저를 실행합니다. 첫 번째 매개 변수는 제품 ID(819
)이고 두 번째 매개 변수 @CheckDate
datetime 값입니다.
DECLARE @CheckDate AS DATETIME;
SET @CheckDate = GETDATE();
EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
C. 변수와 함께 EXECUTE 'tsql_string' 사용
다음 예에서는 EXECUTE
가 변수가 포함된 동적으로 작성된 문자열을 처리하는 방법을 보여 줍니다. 이 예에서는 tables_cursor
데이터베이스에 있는 모든 사용자 정의 테이블의 목록을 유지하는 AdventureWorks2022
커서를 만든 다음 해당 목록을 사용하여 테이블의 모든 인덱스를 다시 작성합니다.
DECLARE tables_cursor CURSOR
FOR SELECT s.name, t.name FROM sys.objects AS t
INNER JOIN sys.schemas AS s ON s.schema_id = t.schema_id
WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname AS sysname;
DECLARE @tablename AS sysname;
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
EXECUTE ('ALTER INDEX ALL ON ' +
@schemaname + '.' +
@tablename + ' REBUILD;');
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
END
PRINT 'The indexes on all tables have been rebuilt.';
CLOSE tables_cursor;
DEALLOCATE tables_cursor;
D. 원격 저장 프로시저와 함께 EXECUTE 사용
다음 예에서는 uspGetEmployeeManagers
원격 서버에서 SQLSERVER1
저장 프로시저를 실행하고 성공이나 실패를 나타내는 반환 상태를 @retstat
에 저장합니다.
DECLARE @retstat AS INT;
EXECUTE
@retstat = SQLSERVER1.AdventureWorks2022.dbo.uspGetEmployeeManagers
@BusinessEntityID = 6;
E. 저장 프로시저 변수와 함께 EXECUTE 사용
다음 예에서는 저장 프로시저 이름을 나타내는 변수를 만듭니다.
DECLARE @proc_name AS VARCHAR (30);
SET @proc_name = 'sys.sp_who';
EXECUTE @proc_name;
F. DEFAULT와 함께 EXECUTE 사용
다음 예에서는 첫 번째 및 세 번째 매개 변수에 대한 기본값으로 저장 프로시저를 만듭니다. 프로시저가 실행될 때 호출에 값이 전달되지 않거나 기본값이 지정되는 경우 이러한 기본값은 첫 번째 및 세 번째 매개 변수용으로 삽입됩니다.
DEFAULT
키워드를 사용할 수 있는 여러 가지 방법이 있습니다.
IF OBJECT_ID(N'dbo.ProcTestDefaults', N'P') IS NOT NULL
DROP PROCEDURE dbo.ProcTestDefaults;
GO
-- Create the stored procedure.
CREATE PROCEDURE dbo.ProcTestDefaults (
@p1 SMALLINT = 42,
@p2 CHAR (1),
@p3 VARCHAR (8) = 'CAR'
)
AS
SET NOCOUNT ON;
SELECT @p1, @p2, @p3;
GO
Proc_Test_Defaults
저장 프로시저는 여러 가지 조합으로 실행할 수 있습니다.
-- Specifying a value only for one parameter (@p2).
EXECUTE dbo.ProcTestDefaults @p2 = 'A';
-- Specifying a value for the first two parameters.
EXECUTE dbo.ProcTestDefaults 68, 'B';
-- Specifying a value for all three parameters.
EXECUTE dbo.ProcTestDefaults 68, 'C', 'House';
-- Using the DEFAULT keyword for the first parameter.
EXECUTE dbo.ProcTestDefaults
@p1 = DEFAULT,
@p2 = 'D';
-- Specifying the parameters in an order different from the order defined in the procedure.
EXECUTE dbo.ProcTestDefaults DEFAULT,
@p3 = 'Local',
@p2 = 'E';
-- Using the DEFAULT keyword for the first and third parameters.
EXECUTE dbo.ProcTestDefaults DEFAULT, 'H', DEFAULT;
EXECUTE dbo.ProcTestDefaults DEFAULT, 'I', @p3 = DEFAULT;
G. AT linked_server_name EXECUTE 사용
다음 예에서는 원격 서버에 명령 문자열을 전달하고 SQL Server의 다른 인스턴스를 가리키는 SeattleSales
연결된 서버를 만든 다음 이 연결된 서버에 대해 DDL 문(CREATE TABLE
)을 실행합니다.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
EXECUTE ('CREATE TABLE AdventureWorks2022.dbo.SalesTbl
(SalesID INT, SalesName VARCHAR(10)); ') AT SeattleSales;
GO
H. EXECUTE WITH RECOMPILE 사용
다음 예에서는 Proc_Test_Defaults
저장 프로시저를 실행하고 모듈을 실행한 후 새 쿼리 계획을 컴파일하고 사용한 다음, 삭제하도록 합니다.
EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO
9\. 사용자 정의 함수와 함께 EXECUTE 사용
다음 예제에서는 AdventureWorks2022 ufnGetSalesOrderStatusText
데이터베이스에서 스칼라 사용자 정의 함수를 실행합니다. 이 예에서는 @returnstatus
변수를 사용하여 함수가 반환하는 값을 저장합니다. 함수에는 입력 매개 변수 하나(@Status
)가 필요합니다. 이 매개 변수는 tinyint 데이터 형식으로 정의됩니다.
DECLARE @returnstatus AS NVARCHAR (15);
SET @returnstatus = NULL;
EXECUTE
@returnstatus = dbo.ufnGetSalesOrderStatusText
@Status = 2;
PRINT @returnstatus;
GO
J. EXECUTE를 사용하여 연결된 서버에서 Oracle 데이터베이스 쿼리
다음 예에서는 원격 Oracle 서버에서 몇 가지 SELECT
문을 실행합니다. 먼저 Oracle 서버를 연결된 서버로 추가한 다음 연결된 서버 로그인을 만듭니다.
-- Setup the linked server.
EXECUTE sp_addlinkedserver
@server = 'ORACLE',
@srvproduct = 'Oracle',
@provider = 'OraOLEDB.Oracle',
@datasrc = 'ORACLE10';
EXECUTE sp_addlinkedsrvlogin
@rmtsrvname = 'ORACLE',
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'scott',
@rmtpassword = 'tiger';
EXECUTE sp_serveroption 'ORACLE', 'rpc out', true;
GO
-- Execute several statements on the linked Oracle server.
EXECUTE ('SELECT * FROM scott.emp') AT ORACLE;
GO
EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v AS INT;
SET @v = 7902;
EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO
11. EXECUTE AS USER를 사용하여 컨텍스트를 다른 사용자로 전환
다음 예에서는 테이블을 만들고 AS USER
절을 지정하여 문의 실행 컨텍스트를 호출자에서 User1
로 전환하는 Transact-SQL 문자열을 실행합니다. 데이터베이스 엔진은 문이 실행되면 User1
권한을 확인합니다.
User1
은 데이터베이스에 사용자로 존재해야 하며 Sales
스키마에서 테이블을 만들 수 있는 사용 권한이 있어야 합니다. 그렇지 않으면 문이 실행되지 않습니다.
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID INT, SalesName VARCHAR(10));')
AS USER = 'User1';
GO
12. EXECUTE 및 AT linked_server_name 매개 변수 사용
다음 예에서는 매개 변수에 물음표(?
) 자리 표시자를 사용하여 원격 서버로 명령 문자열을 전달합니다. SQL Server의 다른 인스턴스를 가리키는 SeattleSales
연결된 서버를 만든 다음 이 연결된 서버에 대해 SELECT
문을 실행합니다.
SELECT
문은 물음표를 ProductID
매개 변수(952
)에 대한 자리 표시자로 사용합니다. 이 매개 변수는 문 다음에 입력합니다.
-- Setup the linked server.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name
FROM AdventureWorks2022.Production.Product
WHERE ProductID = ? ', 952) AT SeattleSales;
GO
13. EXECUTE를 사용하여 단일 결과 집합 다시 정의
적용 대상: SQL Server 2012(11.x) 이상 버전 및 Azure SQL Database.
이전 예제 중 일부는 7개의 열을 반환한 EXECUTE dbo.uspGetEmployeeManagers 6;
실행했습니다. 다음 예에서는 WITH RESULT SET
구문을 사용하여 반환되는 결과 집합의 이름과 데이터 형식을 변경하는 방법을 보여 줍니다.
EXECUTE uspGetEmployeeManagers 16 WITH RESULT SETS
((
[Reporting Level] INT NOT NULL,
[ID of Employee] INT NOT NULL,
[Employee First Name] NVARCHAR (50) NOT NULL,
[Employee Last Name] NVARCHAR (50) NOT NULL,
[Employee ID of Manager] NVARCHAR (MAX) NOT NULL,
[Manager First Name] NVARCHAR (50) NOT NULL,
[Manager Last Name] NVARCHAR (50) NOT NULL
));
14. EXECUTE를 사용하여 두 개의 결과 집합 다시 정의
적용 대상: SQL Server 2012(11.x) 이상 버전 및 Azure SQL Database.
둘 이상의 결과 집합을 반환하는 문을 실행하는 경우 각 예상 결과 집합을 정의합니다.
AdventureWorks2022
의 다음 예에서는 두 결과 집합을 반환하는 프로시저를 만듭니다. 그런 다음 WITH RESULT SETS
절을 사용하여 프로시저를 실행하고 두 개의 결과 집합 정의를 지정합니다.
--Create the procedure
CREATE PROCEDURE Production.ProductList
@ProdName NVARCHAR (50)
AS
-- First result set
SELECT
ProductID,
Name,
ListPrice
FROM Production.Product
WHERE Name LIKE @ProdName;
-- Second result set
SELECT Name,
COUNT(S.ProductID) AS NumberOfOrders
FROM Production.Product AS P
INNER JOIN Sales.SalesOrderDetail AS S
ON P.ProductID = S.ProductID
WHERE Name LIKE @ProdName
GROUP BY Name;
GO
-- Execute the procedure
EXECUTE Production.ProductList '%tire%' WITH RESULT SETS
(
-- first result set definition starts here
(ProductID INT,
[Name] NAME,
ListPrice MONEY)
-- comma separates result set definitions
,
-- second result set definition starts here
([Name] NAME,
NumberOfOrders INT)
);
15. AT DATA_SOURCE data_source_name EXECUTE를 사용하여 원격 SQL Server 쿼리
적용 대상: SQL Server 2019(15.x) 이상 버전.
다음 예에서는 명령 문자열을 SQL Server 인스턴스를 가리키는 외부 데이터 원본에 전달합니다.
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE my_sql_server;
GO
16. AT DATA_SOURCE data_source_name EXECUTE를 사용하여 SQL Server 빅 데이터 클러스터에서 컴퓨팅 풀 쿼리
적용 대상: SQL Server 2019(15.x).
다음 예에서는 명령 문자열을 SQL Server 빅 데이터 클러스터의 컴퓨팅 풀을 가리키는 외부 데이터 원본에 전달합니다. 이 예에서는 SQL Server 빅 데이터 클러스터의 컴퓨팅 풀을 상대로 SqlComputePool
데이터 원본을 만들고 데이터 원본을 상대로 SELECT
문을 실행합니다.
CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlComputePool;
GO
17. AT DATA_SOURCE data_source_name EXECUTE를 사용하여 SQL Server 빅 데이터 클러스터에서 데이터 풀 쿼리
적용 대상: SQL Server 2019(15.x).
다음 예제에서는 SQL Server BDC(빅 데이터 클러스터)의 컴퓨팅 풀을 가리키는 외부 데이터 원본에 명령 문자열을 전달합니다. 이 예제에서는 BDC의 데이터 풀에 대한 데이터 원본 SqlDataPool
만들고 데이터 원본에 대해 SELECT
문을 실행합니다.
CREATE EXTERNAL DATA SOURCE SqlDataPool
WITH (LOCATION = 'sqldatapool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlDataPool;
GO
18. AT DATA_SOURCE data_source_name EXECUTE를 사용하여 SQL Server 빅 데이터 클러스터의 스토리지 풀 쿼리
적용 대상: SQL Server 2019(15.x).
다음 예에서는 명령 문자열을 SQL Server 빅 데이터 클러스터의 컴퓨팅 풀을 가리키는 외부 데이터 원본에 전달합니다. 이 예에서는 SQL Server 빅 데이터 클러스터의 데이터 풀을 상대로 SqlStoragePool
데이터 원본을 만들고 데이터 원본을 상대로 SELECT
문을 실행합니다.
CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlStoragePool;
GO
예제: Azure Synapse Analytics
이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022
홈페이지에서 다운로드할 수 있는 AdventureWorksDW2022
또는 샘플 데이터베이스를 사용합니다.
A: 기본 프로시저 실행
저장 프로시저를 실행합니다.
EXECUTE proc1;
런타임에 이름이 결정된 저장 프로시저를 호출합니다.
EXECUTE ('EXECUTE ' + @var);
저장 프로시저 내에서 저장 프로시저를 호출합니다.
CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;
B: 문자열 실행
SQL 문자열을 실행합니다.
EXECUTE ('SELECT * FROM sys.types');
중첩된 문자열을 실행합니다.
EXECUTE ('EXECUTE (''SELECT * FROM sys.types'')');
문자열 변수를 실행합니다.
DECLARE @stringVar AS NVARCHAR (100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';
EXECUTE (@stringVar);
C: 매개 변수가 있는 프로시저
다음 예제에서는 매개 변수를 사용하여 프로시저를 만들고 프로시저를 실행하는 세 가지 방법을 보여 줍니다.
CREATE PROCEDURE ProcWithParameters (
@name NVARCHAR (50),
@color NVARCHAR (15)
)
AS
SELECT ProductKey,
EnglishProductName,
Color
FROM [dbo].[DimProduct]
WHERE EnglishProductName LIKE @namef
AND Color = @color;
GO
위치 매개 변수를 사용하여 실행합니다.
EXECUTE ProcWithParameters N'%arm%', N'Black';
명명된 매개 변수를 사용하여 순서대로 실행합니다.
EXECUTE ProcWithParameters
@name = N'%arm%',
@color = N'Black';
명명된 매개 변수를 순서대로 사용하여 실행합니다.
EXECUTE ProcWithParameters
@color = N'Black',
@name = N'%arm%';
GO
관련 콘텐츠
- @@NESTLEVEL(Transact-SQL)
- DECLARE @local_variable (Transact-SQL)
- EXECUTE AS 절(Transact-SQL)
- osql 유틸리티
- 보안 주체(데이터베이스 엔진)
- REVERT(Transact-SQL)
- sp_addlinkedserver(Transact-SQL)
- sqlcmd 유틸리티
- SUSER_NAME(Transact-SQL)
- sys.database_principals(Transact-SQL)
- sys.server_principals(Transact-SQL)
- USER_NAME(Transact-SQL)
- OPENDATASOURCE(Transact-SQL)
- 메모리 내 OLTP에 대한 사용자 정의 스칼라 함수