EXECUTE(Transact-SQL)EXECUTE (Transact-SQL)

적용 대상: 예SQL Server(2008부터) 예Azure SQL Database 예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Transact-SQLTransact-SQL 일괄 처리 내에서 또는 시스템 저장 프로시저, 사용자 정의 저장 프로시저, CLR 저장 프로시저, 스칼라 반환 사용자 정의 함수, 확장 저장 프로시저 등과 같은 모듈 중 하나에서 명령 문자열이나 문자열을 실행합니다.Executes a command string or character string within a Transact-SQLTransact-SQL batch, or one of the following modules: system stored procedure, user-defined stored procedure, CLR stored procedure, scalar-valued user-defined function, or extended stored procedure. EXECUTE 문은 연결된 서버로 통과 명령을 보내는 데 사용할 수 있습니다.The EXECUTE statement can be used to send pass-through commands to linked servers. 또한 문자열이나 명령이 실행되는 컨텍스트를 명시적으로 설정할 수도 있습니다.Additionally, the context in which a string or command is executed can be explicitly set. WITH RESULT SETS 옵션을 사용하여 결과 집합에 대한 메타데이터를 정의할 수 있습니다.Metadata for the result set can be defined by using the WITH RESULT SETS options.

중요

문자열을 사용하여 EXECUTE를 호출하려면 먼저 문자열의 유효성을 검사해야 합니다.Before you call EXECUTE with a character string, validate the character string. 유효성을 검사하지 않은 사용자 입력으로 생성된 명령은 실행하지 마세요.Never execute a command constructed from user input that has not been validated.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

-- Syntax for SQL Server  
  
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 ] ) }  
}  
-- Syntax for 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  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

-- 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 ] )  
[;]  

인수Arguments

@return_status@return_status
모듈의 반환 상태를 저장하는 선택적 정수 변수입니다.Is an optional integer variable that stores the return status of a module. EXECUTE 문에서 이 변수를 사용하려면 먼저 일괄 처리, 저장 프로시저 또는 함수에서 변수를 선언해야 합니다.This variable must be declared in the batch, stored procedure, or function before it is used in an EXECUTE statement.

스칼라 반환 사용자 정의 함수를 호출하는 데 사용하는 경우에는 모든 스칼라 데이터 형식을 @return_status 변수로 사용할 수 있습니다.When used to invoke a scalar-valued user-defined function, the @return_status variable can be of any scalar data type.

module_namemodule_name
호출할 저장 프로시저나 스칼라 반환 사용자 정의 함수의 정규화되거나 정규화되지 않은 이름입니다.Is the fully qualified or nonfully qualified name of the stored procedure or scalar-valued user-defined function to call. 모듈 이름은 식별자 규칙을 따라야 합니다.Module names must comply with the rules for identifiers. 확장 저장 프로시저의 이름은 서버의 데이터 정렬에 관계없이 항상 대/소문자를 구분합니다.The names of extended stored procedures are always case-sensitive, regardless of the collation of the server.

다른 데이터베이스에서 생성된 모듈은 이 모듈을 실행하는 사용자가 모듈을 소유하고 있거나 해당 데이터베이스에서 모듈을 실행할 수 있는 적절한 사용 권한이 있는 경우에 실행될 수 있습니다.A module that has been created in another database can be executed if the user running the module owns the module or has the appropriate permission to execute it in that database. SQL ServerSQL Server를 실행하고 있는 다른 서버에서 모듈을 실행하려면 모듈을 실행하는 사용자가 원격 액세스를 통해 서버에 연결하여 해당 데이터베이스에서 모듈을 실행할 수 있는 적절한 사용 권한을 갖고 있어야 합니다.A module can be executed on another server running SQL ServerSQL Server if the user running the module has the appropriate permission to use that server (remote access) and to execute the module in that database. 서버 이름은 지정했지만 데이터베이스 이름은 지정하지 않은 경우 SQL Server 데이터베이스 엔진SQL Server Database Engine은 사용자의 기본 데이터베이스에서 모듈을 찾습니다.If a server name is specified but no database name is specified, the SQL Server 데이터베이스 엔진SQL Server Database Engine looks for the module in the default database of the user.

;number;number
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

같은 이름의 프로시저를 그룹화하는 데 사용하는 정수입니다(선택 사항).Is an optional integer that is used to group procedures of the same name. 이 매개 변수는 확장 저장 프로시저에는 사용하지 않습니다.This parameter is not used for extended stored procedures.

참고

이 기능은 유지 관리 모드에 있으며, Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

프로시저 그룹에 대한 자세한 내용은CREATE PROCEDURE (Transact-SQL)를 참조하세요.For more information about procedure groups, see CREATE PROCEDURE (Transact-SQL).

@module_name_var@module_name_var
로컬로 정의된 변수 이름이며 모듈 이름을 나타냅니다.Is the name of a locally defined variable that represents a module name.

이것은 고유하게 컴파일된 스칼라 사용자 정의 함수의 이름을 담는 변수일 수 있습니다.This can be a variable that holds the name of a natively compiled, scalar user-defined function.

@parameter@parameter
module_name에 대한 매개 변수이며 모듈에서 정의됩니다.Is the parameter for module_name, as defined in the module. 매개 변수 이름 앞에는 반드시 at 기호(@)를 사용해야 합니다.Parameter names must be preceded by the at sign (@). @parameter_name=value 형식을 사용하는 경우에는 매개 변수 이름과 상수를 모듈에서 정의된 순서대로 제공하지 않아도 됩니다.When used with the @parameter_name=value form, parameter names and constants do not have to be supplied in the order in which they are defined in the module. 그러나 임의의 매개 변수에 @parameter_name=value 형식을 사용한 경우에는 이후에 사용할 모든 매개 변수에도 이 형식을 사용해야 합니다.However, if the @parameter_name=value form is used for any parameter, it must be used for all subsequent parameters.

기본적으로 매개 변수에 Null이 허용됩니다.By default, parameters are nullable.

valuevalue
모듈이나 통과 명령에 전달할 매개 변수 값입니다.Is the value of the parameter to pass to the module or pass-through command. 매개 변수 이름을 지정하지 않은 경우에는 모듈에 정의된 순서대로 매개 변수 값을 제공해야 합니다.If parameter names are not specified, parameter values must be supplied in the order defined in the module.

연결된 서버에 대해 통과 명령을 실행하는 경우 연결된 서버의 OLE DB 공급자에 따라 매개 변수 값의 순서가 달라집니다.When executing pass-through commands against linked servers, the order of the parameter values depends on the OLE DB provider of the linked server. 대부분의 OLE DB 공급자는 값을 왼쪽에서 오른쪽으로 매개 변수에 바인딩합니다.Most OLE DB providers bind values to parameters from left to right.

매개 변수 값이 개체 이름이거나 문자열인 경우 또는 데이터베이스 이름이나 스키마 이름으로 한정되는 경우에는 반드시 전체 이름을 작은따옴표로 묶어야 합니다.If the value of a parameter is an object name, character string, or qualified by a database name or schema name, the whole name must be enclosed in single quotation marks. 매개 변수 값이 키워드인 경우에는 반드시 큰따옴표로 키워드를 묶어야 합니다.If the value of a parameter is a keyword, the keyword must be enclosed in double quotation marks.

@으로 시작하지 않고 따옴표로 묶이지 않은 단일 단어를 전달하는 경우, 예를 들어 매개 변수 이름에서 @이 빠지면 따옴표가 없더라도 해당 단어는 nvarchar 문자열로 처리됩니다.If you pass a single word that does not begin with @ and that's not enclosed in quotation marks - for example, if you forget @ on a parameter name - the word is treated as an nvarchar string, in spite of the missing quotation marks.

기본값이 모듈에서 정의된 경우 사용자가 매개 변수를 지정하지 않고 모듈을 실행할 수 있습니다.If a default is defined in the module, a user can execute the module without specifying a parameter.

기본값으로 NULL을 사용할 수도 있습니다.The default can also be NULL. 일반적으로 모듈 정의는 매개 변수 값이 NULL일 때 수행할 동작을 지정합니다.Generally, the module definition specifies the action that should be taken if a parameter value is NULL.

@variable@variable
매개 변수를 저장하거나 반환하는 변수입니다.Is the variable that stores a parameter or a return parameter.

OUTPUTOUTPUT
모듈이나 명령 문자열에서 매개 변수를 반환하도록 지정합니다.Specifies that the module or command string returns a parameter. 모듈이나 명령 문자열에서 일치하는 매개 변수가 반드시 OUTPUT 키워드를 사용하여 생성되어 있어야 합니다.The matching parameter in the module or command string must also have been created by using the keyword OUTPUT. 커서 변수를 매개 변수로 사용할 때 이 키워드를 사용합니다.Use this keyword when you use cursor variables as parameters.

이 연결된 서버에 대해 실행되는 모듈의 OUTPUT으로 정의된 경우 OLE DB 공급자가 해당@매개 변수에 수행한 모든 변경 내용은 모듈 실행이 끝날 때 변수로 다시 복사됩니다.If value is defined as OUTPUT of a module executed against a linked server, any changes to the corresponding @parameter performed by the OLE DB provider will be copied back to the variable at the end of the execution of module.

OUTPUT 매개 변수를 사용하고 있거나 호출 일괄 처리 또는 모듈 내의 다른 문에서 반환 값을 사용하려는 경우에는 매개 변수 값을 @매개 변수 = @과 같은 형식의 변수로 전달해야 합니다.If OUTPUT parameters are being used and the intent is to use the return values in other statements within the calling batch or module, the value of the parameter must be passed as a variable, such as @parameter = @variable. 모듈에서 OUTPUT 매개 변수로 정의되지 않은 매개 변수에 대해 OUTPUT을 지정하여 모듈을 실행할 수는 없습니다.You cannot execute a module by specifying OUTPUT for a parameter that is not defined as an OUTPUT parameter in the module. 상수는 OUTPUT을 사용하여 모듈에 전달할 수 없습니다. 반환 매개 변수에는 변수 이름이 필요합니다.Constants cannot be passed to module by using OUTPUT; the return parameter requires a variable name. 프로시저를 실행하기 전에 변수의 데이터 형식이 선언되어야 하며 값이 할당되어야 합니다.The data type of the variable must be declared and a value assigned before executing the procedure.

EXECUTE를 원격 저장 프로시저에 사용하거나 연결된 서버에 대해 통과 명령을 실행하는 데 사용하는 경우 OUTPUT 매개 변수에는 LOB(Large Object) 데이터 형식을 사용할 수 없습니다.When EXECUTE is used against a remote stored procedure, or to execute a pass-through command against a linked server, OUTPUT parameters cannot be any one of the large object (LOB) data types.

반환 매개 변수에는 LOB 데이터 형식을 제외한 모든 데이터 형식을 사용할 수 있습니다.Return parameters can be of any data type except the LOB data types.

DEFAULTDEFAULT
모듈에 정의된 매개 변수의 기본값을 제공합니다.Supplies the default value of the parameter as defined in the module. 정의된 기본값이 없는 매개 변수 값이 모듈에 필요하고 매개 변수가 손실되었거나 DEFAULT 키워드가 지정된 경우에는 오류가 발생합니다.When the module expects a value for a parameter that does not have a defined default and either a parameter is missing or the DEFAULT keyword is specified, an error occurs.

@string_variable@string_variable
지역 변수의 이름입니다.Is the name of a local variable. @string_variablechar, varchar, nchar 또는 nvarchar 데이터 형식이 될 수 있습니다. @string_variable can be any char, varchar, nchar, or nvarchar data type. 여기에는 (max) 데이터 형식이 포함됩니다.These include the (max) data types.

[N] 'tsql_string'[N] 'tsql_string'
상수 문자열입니다.Is a constant string. tsql_stringnvarchar 또는 varchar 데이터 형식이 될 수 있습니다.tsql_string can be any nvarchar or varchar data type. N을 포함하면 문자열이 nvarchar 데이터 형식으로 해석됩니다.If the N is included, the string is interpreted as nvarchar data type.

AS <context_specification>AS <context_specification>
문이 실행될 컨텍스트를 지정합니다.Specifies the context in which the statement is executed.

LoginLOGIN
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

가장할 컨텍스트를 로그인으로 지정합니다.Specifies the context to be impersonated is a login. 가장의 범위는 서버입니다.The scope of impersonation is the server.

UserUSER
가장할 컨텍스트를 현재 데이터베이스의 사용자로 지정합니다.Specifies the context to be impersonated is a user in the current database. 가장의 범위는 현재 데이터베이스로 제한됩니다.The scope of impersonation is restricted to the current database. 데이터베이스 사용자로 컨텍스트 전환 시 해당 사용자의 서버 수준 사용 권한은 상속되지 않습니다.A context switch to a database user does not inherit the server-level permissions of that user.

중요

데이터베이스 사용자로의 컨텍스트 전환이 활성 상태인 경우 데이터베이스 외부에 있는 리소스에 액세스하려고 시도하면 문이 실행되지 않습니다.While the context switch to the database user is active, any attempt to access resources outside the database will cause the statement to fail. 이러한 문에는 USE 데이터베이스 문, 분산 쿼리, 그리고 세 부분이나 네 부분으로 된 식별자를 사용하여 다른 데이터베이스를 참조하는 쿼리가 포함됩니다.This includes USE database statements, distributed queries, and queries that reference another database by using three- or four-part identifiers.

'name''name'
유효한 사용자 또는 로그인 이름입니다.Is a valid user or login name. name은 sysadmin 고정 서버 역할의 멤버이거나 sys.database_principals 또는 sys.server_principals에서 각각 보안 주체여야 합니다.name must be a member of the sysadmin fixed server role or exist as a principal in sys.database_principals or sys.server_principals, respectively.

name에는 NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService 또는 NT AUTHORITY\LocalSystem과 같은 기본 제공 계정을 사용할 수 없습니다.name cannot be a built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

자세한 내용은 이 항목의 뒤에 나오는 사용자 또는 로그인 이름 지정을 참조하세요.For more information, see Specifying a User or Login Name later in this topic.

[N] 'command_string'[N] 'command_string'
연결된 서버로 전달될 명령을 포함하는 상수 문자열입니다.Is a constant string that contains the command to be passed through to the linked server. N을 포함하면 문자열이 nvarchar 데이터 형식으로 해석됩니다.If the N is included, the string is interpreted as nvarchar data type.

[?][?]
EXEC('...', <arg-list>) AT <linkedsrv> 문에 사용되는 통과 명령의 <arg-list>에 값을 제공할 매개 변수를 나타냅니다.Indicates parameters for which values are supplied in the <arg-list> of pass-through commands that are used in an EXEC('...', <arg-list>) AT <linkedsrv> statement.

AT linked_server_nameAT linked_server_name
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

command_stringlinked_server_name에 대해 실행되고 결과(있을 경우)가 클라이언트로 반환되도록 지정합니다.Specifies that command_string is executed against linked_server_name and results, if any, are returned to the client. linked_server_name은 로컬 서버의 기존 연결된 서버 정의를 참조해야 합니다.linked_server_name must refer to an existing linked server definition in the local server. 연결된 서버는 sp_addlinkedserver를 사용하여 정의합니다.Linked servers are defined by using sp_addlinkedserver.

WITH <execute_option>WITH <execute_option>
가능한 실행 옵션은 아래와 같습니다.Possible execute options. INSERT...EXEC 문에서 RESULT SETS 옵션을 지정할 수 없습니다.The RESULT SETS options cannot be specified in an INSERT...EXEC statement.

용어Term 정의Definition
RECOMPILERECOMPILE 모듈을 실행한 후 새 계획을 컴파일하고 사용한 다음 삭제하도록 합니다.Forces a new plan to be compiled, used, and discarded after the module is executed. 모듈에 대한 기존 쿼리 계획이 있는 경우 이 계획은 캐시에 유지됩니다.If there is an existing query plan for the module, this plan remains in the cache.

제공하는 매개 변수가 불규칙하거나 데이터가 현저하게 변경된 경우에 이 옵션을 사용합니다.Use this option if the parameter you are supplying is atypical or if the data has significantly changed. 이 옵션은 확장 저장 프로시저에는 사용하지 않습니다.This option is not used for extended stored procedures. 이 옵션은 비용이 많이 들기 때문에 반드시 필요한 경우에만 사용하는 것이 좋습니다.We recommend that you use this option sparingly because it is expensive.

참고: OPENDATASOURCE 구문을 사용하는 저장 프로시저를 호출할 경우 WITH RECOMPILE을 사용할 수 없습니다.Note: You can not use WITH RECOMPILE when calling a stored procedure that uses OPENDATASOURCE syntax. WITH RECOMPILE 옵션은 네 부분으로 된 개체 이름이 지정될 때 무시됩니다.The WITH RECOMPILE option is ignored when a four-part object name is specified.

참고: RECOMPILE은 고유하게 컴파일된 사용자 정의 스칼라 함수에서 지원되지 않습니다.Note: RECOMPILE is not supported with natively compiled, scalar user-defined functions. 다시 컴파일해야 하는 경우 sp_recompile (Transact-SQL)을 사용합니다.If you need to recompile, use sp_recompile (Transact-SQL).
RESULT SETS UNDEFINEDRESULT SETS UNDEFINED 적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database.

이 옵션은 반환되는 결과(있는 경우)를 보장하지 않으며 정의를 제공하지 않습니다.This option provides no guarantee of what results, if any, will be returned, and no definition is provided. 어떤 결과가 반환되거나 결과가 반환되지 않는 경우에도 이 문은 오류 없이 실행됩니다.The statement executes without error if any results are returned or no results are returned. RESULT SETS UNDEFINED는 result_sets_option을 제공하지 않는 경우의 기본 동작입니다.RESULT SETS UNDEFINED is the default behavior if a result_sets_option is not provided.

해석된 스칼라 사용자 정의 함수와 고유하게 컴파일된 스칼라 사용자 정의 함수의 경우, 함수가 결과 집합을 반환하지 않기 때문에 이 옵션이 작동하지 않습니다.For interpreted scalar user-defined functions, and natively compiled scalar user-defined functions, this option is not operational because the functions never return a result set.
RESULT SETS NONERESULT SETS NONE 적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database.

execute 문이 어떠한 결과도 반환하지 않습니다.Guarantees that the execute statement will not return any results. 결과가 반환되는 경우 일괄 처리가 중단됩니다.If any results are returned the batch is aborted.

해석된 스칼라 사용자 정의 함수와 고유하게 컴파일된 스칼라 사용자 정의 함수의 경우, 함수가 결과 집합을 반환하지 않기 때문에 이 옵션이 작동하지 않습니다.For interpreted scalar user-defined functions, and natively compiled scalar user-defined functions, this option is not operational because the functions never return a result set.
<result_sets_definition><result_sets_definition> 적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database.

결과가 result_sets_definition에 지정된 대로 반환됩니다.Provides a guarantee that the result will come back as specified in the result_sets_definition. 여러 결과 집합을 반환하는 문의 경우 result_sets_definition 섹션을 여러 개 제공합니다.For statements that return multiple result sets, provide multiple result_sets_definition sections. 각각의 result_sets_definition를 괄호로 묶고 쉼표로 구분합니다.Enclose each result_sets_definition in parentheses, separated by commas. 자세한 내용은 이 항목의 뒷부분에 나오는 <result_sets_definition>를 참조하세요.For more information, see <result_sets_definition> later in this topic.

이 옵션에서는 함수가 결과 집합을 반환하지 않기 때문에 고유하게 컴파일된 스칼라 사용자 정의 함수에 대해 항상 오류를 냅니다.This option always results in an error for natively compiled, scalar user-defined functions because the functions never return a result set.

<result_sets_definition> 적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x)에서 SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database까지<result_sets_definition> Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database

실행된 문이 반환하는 결과 집합에 대해 설명합니다.Describes the result sets returned by the executed statements. result_sets_definition 절의 의미는 다음과 같습니다.The clauses of the result_sets_definition have the following meaning

용어Term 정의Definition
{{

column_namecolumn_name

data_typedata_type

[ COLLATE collation_name][ COLLATE collation_name]

[NULL | NOT NULL][NULL | NOT NULL]

}}
아래 표를 참조하세요.See the table below.
db_namedb_name 테이블, 뷰 또는 테이블 반환 함수를 포함하는 데이터베이스의 이름입니다.The name of the database containing the table, view or table valued function.
schema_nameschema_name 테이블, 뷰 또는 테이블 반환 함수를 소유한 스키마의 이름입니다.The name of the schema owning the table, view or table valued function.
table_name | view_name | table_valued_function_nametable_name | view_name | table_valued_function_name 명명된 테이블, 뷰 또는 테이블 반환 함수에 지정된 열을 반환하도록 지정합니다.Specifies that the columns returned will be those specified in the table, view or table valued function named. 테이블 변수, 임시 테이블 및 동의어는 AS 개체 구문에서 지원되지 않습니다.Table variables, temporary tables, and synonyms are not supported in the AS object syntax.
AS TYPE [schema_name.]table_type_nameAS TYPE [schema_name.]table_type_name 테이블 형식에 지정된 열을 반환하도록 지정합니다.Specifies that the columns returned will be those specified in the table type.
AS FOR XMLAS FOR XML EXECUTE 문에서 호출하는 문 또는 저장 프로시저의 XML 결과를 SELECT ... FOR XML ... 문에 의해 생성된 것처럼 형식을 변환하도록 지정합니다.Specifies that the XML results from the statement or stored procedure called by the EXECUTE statement will be converted into the format as though they were produced by a SELECT ... FOR XML ... statement. 원래 문의 type 지시어에서 모든 서식이 제거되고 type 지시어를 지정하지 않은 경우처럼 결과가 반환됩니다.All formatting from the type directives in the original statement are removed, and the results returned are as though no type directive was specified. AS FOR XML은 실행된 문 또는 저장 프로시저에서 비-XML 테이블 형식 결과를 XML로 변환하지 않습니다.AS FOR XML does not convert non-XML tabular results from the executed statement or stored procedure into XML.
용어Term 정의Definition
column_namecolumn_name 각 열의 이름입니다.The names of each column. 열의 개수가 결과 집합과 다른 경우 오류가 발생하고 일괄 처리가 중단됩니다.If the number of columns differs from the result set, an error occurs and the batch is aborted. 열의 이름이 결과 집합과 다른 경우 반환된 열 이름이 정의된 이름으로 설정됩니다.If the name of a column differs from the result set, the column name returned will be set to the name defined.
data_typedata_type 각 열의 데이터 형식입니다.The data types of each column. 데이터 형식이 다른 경우 정의된 데이터 형식으로 암시적 변환을 수행합니다.If the data types differ, an implicit conversion to the defined data type is performed. 변환에 실패하는 경우 일괄 처리가 중단됩니다.If the conversion fails the batch is aborted
COLLATE collation_nameCOLLATE collation_name 각 열의 데이터 정렬입니다.The collation of each column. 데이터 정렬이 일치하지 않는 경우 암시적 데이터 정렬이 시도됩니다.If there is a collation mismatch, an implicit collation is attempted. 데이터 정렬이 실패하는 경우 일괄 처리가 중단됩니다.If that fails, the batch is aborted.
NULL | NOT NULLNULL | NOT NULL 각 열의 null 허용 여부입니다.The nullability of each column. null 허용 여부가 NOT NULL로 정의되어 있지만 반환된 데이터에 NULL이 포함되어 있는 경우 오류가 발생하고 일괄 처리가 중단됩니다.If the defined nullability is NOT NULL and the data returned contains NULLs an error occurs and the batch is aborted. 지정하지 않은 경우 ANSI_NULL_DFLT_ON and ANSI_NULL_DFLT_OFF 옵션 설정이 기본값으로 사용됩니다.If not specified, the default value conforms to the setting of the ANSI_NULL_DFLT_ON and ANSI_NULL_DFLT_OFF options.

실행 중에 반환되는 실제 결과 집합은 WITH RESULT SETS 절을 사용하여 결과 집합 수, 열 수, 열 이름, null 허용 여부, 데이터 형식 중 한 가지 방법으로 정의된 결과와 다를 수 있습니다.The actual result set being returned during execution can differ from the result defined using the WITH RESULT SETS clause in one of the following ways: number of result sets, number of columns, column name, nullability, and data type. 결과 집합의 수가 다른 경우 오류가 발생하고 일괄 처리가 중단됩니다.If the number of result sets differs, an error occurs and the batch is aborted.

RemarksRemarks

value 또는 @parameter_name=value를 사용하여 매개 변수를 제공할 수 있습니다.Parameters can be supplied either by using value or by using @parameter_name=value. 를 사용하여 제공할 수 있습니다. 매개 변수는 트랜잭션의 일부가 아니므로 나중에 롤백되는 트랜잭션에서 매개 변수가 변경된 경우 해당 매개 변수의 값은 이전 값으로 되돌아가지 않습니다.A parameter is not part of a transaction; therefore, if a parameter is changed in a transaction that is later rolled back, the value of the parameter does not revert to its previous value. 호출자에게 반환되는 값은 항상 모듈이 반환되는 시점의 값입니다.The value returned to the caller is always the value at the time the module returns.

한 모듈에서 다른 모듈을 호출하거나 CLR(공용 언어 런타임) 모듈, 사용자 정의 유형 또는 집계를 참조하여 관리 코드를 실행하면 중첩이 발생합니다.Nesting occurs when one module calls another or executes managed code by referencing a common language runtime (CLR) module, user-defined type, or aggregate. 호출된 모듈이나 관리 코드 참조가 실행될 때는 중첩 수준이 증가하고 호출된 모듈이나 관리 코드 참조가 끝날 때는 중첩 수준이 감소합니다.The nesting level is incremented when the called module or managed code reference starts execution, and it is decremented when the called module or managed code reference has finished. 최대값인 32 중첩 수준을 초과하면 전체 호출 체인이 실행되지 않습니다.Exceeding the maximum of 32 nesting levels causes the complete calling chain to fail. 현재 중첩 수준은 @@NESTLEVEL system 함수에 저장됩니다.The current nesting level is stored in the @@NESTLEVEL system function.

BEGIN DISTRIBUTED TRANSACTION 문에서 실행되지 않았거나 다양한 구성 옵션과 함께 사용되는 경우 원격 저장 프로시저와 확장 저장 프로시저는 트랜잭션의 범위 밖에 있으므로 호출을 통해 실행되는 명령은 롤백할 수 없습니다.Because remote stored procedures and extended stored procedures are not within the scope of a transaction (unless issued within a BEGIN DISTRIBUTED TRANSACTION statement or when used with various configuration options), commands executed through calls to them cannot be rolled back. 자세한 내용은 시스템 저장 프로시저 (Transact-SQL)BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)을 참조하세요.For more information, see System Stored Procedures (Transact-SQL) and BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

커서 변수를 사용할 때 변수에 할당된 커서와 함께 커서 변수에서 전달되는 프로시저를 실행하면 오류가 발생합니다.When you use cursor variables, if you execute a procedure that passes in a cursor variable with a cursor allocated to it an error occurs.

문이 일괄 처리의 첫 번째 문인 경우에는 모듈을 실행할 때 EXECUTE 키워드를 지정할 필요가 없습니다.You do not have to specify the EXECUTE keyword when executing modules if the statement is the first one in a batch.

CLR 저장 프로시저에 대한 자세한 내용은 CLR 저장 프로시저를 참조하세요.For additional information specific to CLR stored procedures, see CLR Stored Procedures.

저장 프로시저와 함께 EXECUTE 사용Using EXECUTE with Stored Procedures

문이 일괄 처리의 첫 번째 문인 경우에는 저장 프로시저를 실행할 때 EXECUTE 키워드를 지정할 필요가 없습니다.You do not have to specify the EXECUTE keyword when you execute stored procedures when the statement is the first one in a batch.

SQL ServerSQL Server 시스템 저장 프로시저는 sp_로 시작합니다.system stored procedures start with the characters sp_. 시스템 저장 프로시저는 물리적으로 리소스 데이터베이스에 저장되지만 논리적으로는 모든 시스템 정의 데이터베이스와 사용자 정의 데이터베이스의 sys 스키마에 나타납니다.They are physically stored in the Resource database, but logically appear in the sys schema of every system and user-defined database. 시스템 저장 프로시저를 일괄 처리에서 실행하거나 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 실행할 때는 저장 프로시저 이름을 sys 스키마 이름으로 한정하는 것이 좋습니다.When you execute a system stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with the sys schema name.

SQL ServerSQL Server 시스템 확장 저장 프로시저는 xp_로 시작하며 master 데이터베이스의 dbo 스키마에 들어 있습니다.system extended stored procedures start with the characters xp_, and these are contained in the dbo schema of the master database. 시스템 확장 저장 프로시저를 일괄 처리에서 실행하거나 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 실행할 때는 저장 프로시저 이름을 master.dbo로 한정하는 것이 좋습니다.When you execute a system extended stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with master.dbo.

사용자 정의 저장 프로시저를 일괄 처리에서 실행하거나 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 실행할 때는 저장 프로시저 이름을 스키마 이름으로 한정하는 것이 좋습니다.When you execute a user-defined stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with a schema name. 사용자 정의 저장 프로시저의 이름은 시스템 저장 프로시저의 이름과 다르게 지정하는 것이 좋습니다.We do not recommend that you name a user-defined stored procedure with the same name as a system stored procedure. 저장 프로시저 실행에 대한 자세한 내용은 저장 프로시저 실행을 참조하세요.For more information about executing stored procedures, see Execute a Stored Procedure.

문자열과 함께 EXECUTE 사용Using EXECUTE with a Character String

이전 버전의 SQL ServerSQL Server에서는 문자열이 8,000바이트로 제한됩니다.In earlier versions of SQL ServerSQL Server, character strings are limited to 8,000 bytes. 따라서 동적 실행을 위해서는 긴 문자열을 연결해야 합니다.This requires concatenating large strings for dynamic execution. SQL ServerSQL Server에서는 문자열에 최대 2GB의 데이터를 사용할 수 있는 varchar(max)nvarchar(max) 데이터 형식을 지정할 수 있습니다.In SQL ServerSQL Server, the varchar(max) and nvarchar(max) data types can be specified that allow for character strings to be up to 2 gigabytes of data.

데이터베이스 컨텍스트 내의 변경 사항은 EXECUTE 문이 종료될 때까지만 지속됩니다.Changes in database context last only until the end of the EXECUTE statement. 예를 들어 다음 문의 EXEC가 실행된 후의 데이터베이스 컨텍스트는 master입니다.For example, after the EXEC in this following statement is run, the database context is master.

USE master; EXEC ('USE AdventureWorks2012; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');  

컨텍스트 전환Context Switching

AS { LOGIN | USER } = ' name ' 절을 사용하여 동적 문의 실행 컨텍스트를 전환할 수 있습니다.You can use the AS { LOGIN | USER } = ' name ' clause to switch the execution context of a dynamic statement. 컨텍스트 전환이 EXECUTE ('string') AS <context_specification>으로 지정된 경우 컨텍스트 전환 기간은 실행될 쿼리의 범위로 제한됩니다.When the context switch is specified as EXECUTE ('string') AS <context_specification>, the duration of the context switch is limited to the scope of the query being executed.

사용자 또는 로그인 이름 지정Specifying a User or Login Name

AS { LOGIN | USER } = ' name '에 지정된 사용자 또는 로그인 이름은 각각 sys.database_principals 또는 sys.server_principals에서 보안 주체로 존재해야 합니다. 그렇지 않으면 문이 실행되지 않습니다.The user or login name specified in AS { LOGIN | USER } = ' name ' must exist as a principal in sys.database_principals or sys.server_principals, respectively, or the statement will fail. 또한 보안 주체에 IMPERSONATE 권한을 부여해야 합니다.Additionally, IMPERSONATE permissions must be granted on the principal. 호출자가 데이터베이스 소유자가 아니거나 sysadmin 고정 서버 역할의 멤버가 아니라면 사용자가 Windows 그룹 멤버 자격을 통해 SQL ServerSQL Server의 데이터베이스 또는 인스턴스에 액세스하는 경우에도 반드시 보안 주체가 존재해야 합니다.Unless the caller is the database owner or is a member of the sysadmin fixed server role, the principal must exist even when the user is accessing the database or instance of SQL ServerSQL Server through a Windows group membership. 예를 들어 다음과 같은 조건을 가정해 보세요.For example, assume the following conditions:

  • CompanyDomain\SQLUsers 그룹에 Sales 데이터베이스에 대한 액세스 권한이 있습니다.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1은 SQLUsers의 멤버이므로 Sales 데이터베이스에 대한 암시적 액세스 권한이 있습니다.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

CompanyDomain\SqlUser1은 SQLUsers 그룹의 멤버 자격을 통해 데이터베이스에 액세스할 수 있지만 CompanyDomain\SqlUser1이 데이터베이스의 보안 주체로 존재하지 않기 때문에 EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' 문은 실행되지 않습니다.Although CompanyDomain\SqlUser1 has access to the database through membership in the SQLUsers group, the statement EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' will fail because CompanyDomain\SqlUser1 does not exist as a principal in the database.

최선의 구현 방법Best Practices

문이나 모듈에 정의된 작업을 수행하는 데 필요한 최소한의 권한이 있는 로그인이나 사용자를 지정합니다.Specify a login or user that has the least privileges required to perform the operations that are defined in the statement or module. 예를 들어 데이터베이스 수준 권한만 있어도 되는 경우에는 서버 수준 권한이 있는 로그인 이름을 지정하지 마세요. 마찬가지로 데이터베이스 소유자 권한이 필요한 경우가 아니라면 데이터베이스 소유자 계정을 지정하지 마세요.For example, do not specify a login name, which has server-level permissions, if only database-level permissions are required; or do not specify a database owner account unless those permissions are required.

사용 권한Permissions

EXECUTE 문을 실행하는 데에는 사용 권한이 필요하지 않습니다.Permissions are not required to run the EXECUTE statement. 그러나 EXECUTE 문자열 내에서 참조되는 보안 개체에 대해서는 사용 권한이 필요합니다.However, permissions are required on the securables that are referenced within the EXECUTE string. 예를 들어 문자열에 INSERT 문이 있는 경우 EXECUTE 문의 호출자에게는 대상 테이블에 대한 INSERT 권한이 있어야 합니다.For example, if the string contains an INSERT statement, the caller of the EXECUTE statement must have INSERT permission on the target table. EXECUTE 문이 모듈 내에 포함된 경우에도 EXECUTE 문이 실행될 때는 사용 권한 검사가 수행됩니다.Permissions are checked at the time EXECUTE statement is encountered, even if the EXECUTE statement is included within a module.

모듈에 대한 EXECUTE 권한은 기본적으로 모듈 소유자에게 부여되며 모듈 소유자는 이 권한을 다른 사용자에게 이전할 수 있습니다.EXECUTE permissions for a module default to the owner of the module, who can transfer them to other users. 문자열을 실행하는 모듈이 실행될 때는 모듈을 만든 사용자의 컨텍스트가 아니라 모듈을 실행하는 사용자의 컨텍스트에서 사용 권한 검사가 수행됩니다.When a module is run that executes a string, permissions are checked in the context of the user who executes the module, not in the context of the user who created the module. 그러나 동일한 사용자가 호출 모듈과 호출되는 모듈을 모두 소유하는 경우 두 번째 모듈에 대해서는 EXECUTE 권한 검사가 수행되지 않습니다.However, if the same user owns the calling module and the module being called, EXECUTE permission checking is not performed for the second module.

모듈에서 다른 데이터베이스 개체에 액세스하는 경우 사용자에게 모듈에 대한 EXECUTE 권한이 있고 다음 조건 중 하나가 충족된다면 성공적으로 실행됩니다.If the module accesses other database objects, execution succeeds when you have EXECUTE permission on the module and one of the following is true:

  • 모듈이 EXECUTE AS USER 또는 SELF로 표시되어 있으며 모듈 소유자가 참조된 개체에 대한 해당 권한을 갖고 있습니다.The module is marked EXECUTE AS USER or SELF, and the module owner has the corresponding permissions on the referenced object. 모듈 내 가장에 대한 자세한 내용은 EXECUTE AS Clause (Transact-SQL)을 참조하세요.For more information about impersonation within a module, see EXECUTE AS Clause (Transact-SQL).

  • 모듈이 EXECUTE AS CALLER로 표시되어 있으며 사용자가 개체에 대한 해당 권한을 갖고 있습니다.The module is marked EXECUTE AS CALLER, and you have the corresponding permissions on the object.

  • 모듈이 EXECUTE AS user_name으로 표시되어 있으며 user_name이 개체에 대한 해당 권한을 갖고 있습니다.The module is marked EXECUTE AS user_name, and user_name has the corresponding permissions on the object.

컨텍스트 전환 권한Context Switching Permissions

로그인에 EXECUTE AS를 지정하려면 호출자에게 지정한 로그인 이름에 대한 IMPERSONATE 권한이 있어야 합니다.To specify EXECUTE AS on a login, the caller must have IMPERSONATE permissions on the specified login name. 데이터베이스 사용자에 EXECUTE AS를 지정하려면 호출자에게 지정한 사용자 이름에 대한 IMPERSONATE 권한이 있어야 합니다.To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. 실행 컨텍스트를 지정하지 않거나 EXECUTE AS CALLER를 지정한 경우에는 IMPERSONATE 권한이 필요하지 않습니다.When no execution context is specified, or EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

Examples

1.A. EXECUTE를 사용하여 단일 매개 변수 전달Using EXECUTE to pass a single parameter

AdventureWorks2012AdventureWorks2012 데이터베이스의 uspGetEmployeeManagers 저장 프로시저에는 하나의 매개 변수가 필요합니다(@EmployeeID).The uspGetEmployeeManagers stored procedure in the AdventureWorks2012AdventureWorks2012 database expects one parameter (@EmployeeID). 다음 예에서는 매개 변수 값으로 Employee ID 6을 사용하여 uspGetEmployeeManagers 저장 프로시저를 실행합니다.The following examples execute the uspGetEmployeeManagers stored procedure with Employee ID 6 as its parameter value.

EXEC dbo.uspGetEmployeeManagers 6;  
GO  

변수는 실행 시 명시적으로 명명될 수 있습니다.The variable can be explicitly named in the execution:

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;  
GO  

다음이 일괄 처리 또는 osql 또는 sqlcmd 스크립트의 첫 번째 문인 경우에는 EXEC가 필요하지 않습니다.If the following is the first statement in a batch or an osql or sqlcmd script, EXEC is not required.

dbo.uspGetEmployeeManagers 6;  
GO  
--Or  
dbo.uspGetEmployeeManagers @EmployeeID = 6;  
GO  

2.B. 여러 매개 변수 사용Using multiple parameters

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스의 spGetWhereUsedProductID 저장 프로시저를 실행합니다.The following example executes the spGetWhereUsedProductID stored procedure in the AdventureWorks2012AdventureWorks2012 database. 이 저장 프로시저는 두 개의 매개 변수를 전달합니다. 첫 번째 매개 변수는 제품 ID(819)이고 두 번째 매개 변수인 @CheckDate,datetime 값입니다.It passes two parameters: the first parameter is a product ID (819) and the second parameter, @CheckDate, is a datetime value.

DECLARE @CheckDate datetime;  
SET @CheckDate = GETDATE();  
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;  
GO  

C.C. 변수와 함께 EXECUTE 'tsql_string' 사용Using EXECUTE 'tsql_string' with a variable

다음 예에서는 EXECUTE가 변수가 포함된 동적으로 작성된 문자열을 처리하는 방법을 보여 줍니다.The following example shows how EXECUTE handles dynamically built strings that contain variables. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 모든 사용자 정의 테이블의 목록을 유지하는 tables_cursor 커서를 만든 다음 해당 목록을 사용하여 테이블의 모든 인덱스를 다시 작성합니다.This example creates the tables_cursor cursor to hold a list of all user-defined tables in the AdventureWorks2012AdventureWorks2012 database, and then uses that list to rebuild all indexes on the tables.

DECLARE tables_cursor CURSOR  
   FOR  
   SELECT s.name, t.name   
   FROM sys.objects AS t  
   JOIN sys.schemas AS s ON s.schema_id = t.schema_id  
   WHERE t.type = 'U';  
OPEN tables_cursor;  
DECLARE @schemaname sysname;  
DECLARE @tablename 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;  
GO  
  

D.D. 원격 저장 프로시저와 함께 EXECUTE 사용Using EXECUTE with a remote stored procedure

다음 예에서는 uspGetEmployeeManagers 원격 서버에서 SQLSERVER1 저장 프로시저를 실행하고 성공이나 실패를 나타내는 반환 상태를 @retstat에 저장합니다.The following example executes the uspGetEmployeeManagers stored procedure on the remote server SQLSERVER1 and stores the return status that indicates success or failure in @retstat.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

DECLARE @retstat int;  
EXECUTE @retstat = SQLSERVER1.AdventureWorks2012.dbo.uspGetEmployeeManagers @BusinessEntityID = 6;  

E.E. 저장 프로시저 변수와 함께 EXECUTE 사용Using EXECUTE with a stored procedure variable

다음 예에서는 저장 프로시저 이름을 나타내는 변수를 만듭니다.The following example creates a variable that represents a stored procedure name.

DECLARE @proc_name varchar(30);  
SET @proc_name = 'sys.sp_who';  
EXEC @proc_name;  
  

F.F. DEFAULT와 함께 EXECUTE 사용Using EXECUTE with DEFAULT

다음 예에서는 첫 번째 및 세 번째 매개 변수에 대한 기본값으로 저장 프로시저를 만듭니다.The following example creates a stored procedure with default values for the first and third parameters. 프로시저가 실행될 때 호출에 값이 전달되지 않거나 기본값이 지정되는 경우 이러한 기본값은 첫 번째 및 세 번째 매개 변수용으로 삽입됩니다.When the procedure is run, these defaults are inserted for the first and third parameters when no value is passed in the call or when the default is specified. DEFAULT 키워드를 사용할 수 있는 여러 가지 방법이 있습니다.Note the various ways the DEFAULT keyword can be used.

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 저장 프로시저는 여러 가지 조합으로 실행할 수 있습니다.The Proc_Test_Defaults stored procedure can be executed in many combinations.

-- 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.G. AT linked_server_name과 함께 EXECUTE 사용Using EXECUTE with AT linked_server_name

다음 예에서는 원격 서버에 명령 문자열을 전달하고The following example passes a command string to a remote server. SQL ServerSQL Server의 다른 인스턴스를 가리키는 SeattleSales 연결된 서버를 만든 다음 이 연결된 서버에 대해 DDL 문(CREATE TABLE)을 실행합니다.It creates a linked server SeattleSales that points to another instance of SQL ServerSQL Server and executes a DDL statement (CREATE TABLE) against that linked server.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'  
GO  
EXECUTE ( 'CREATE TABLE AdventureWorks2012.dbo.SalesTbl   
(SalesID int, SalesName varchar(10)) ; ' ) AT SeattleSales;  
GO  

H.H. EXECUTE WITH RECOMPILE 사용Using EXECUTE WITH RECOMPILE

다음 예에서는 Proc_Test_Defaults 저장 프로시저를 실행하고 모듈을 실행한 후 새 쿼리 계획을 컴파일하고 사용한 다음, 삭제하도록 합니다.The following example executes the Proc_Test_Defaults stored procedure and forces a new query plan to be compiled, used, and discarded after the module is executed.

EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;  
GO  

9.I. 사용자 정의 함수와 함께 EXECUTE 사용Using EXECUTE with a user-defined function

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스의 ufnGetSalesOrderStatusText 스칼라 사용자 정의 함수를 실행합니다.The following example executes the ufnGetSalesOrderStatusText scalar user-defined function in the AdventureWorks2012AdventureWorks2012 database. 이 예에서는 @returnstatus 변수를 사용하여 함수가 반환하는 값을 저장합니다.It uses the variable @returnstatus to store the value returned by the function. 함수에는 입력 매개 변수 하나(@Status)가 필요합니다.The function expects one input parameter, @Status. 이 매개 변수는 tinyint 데이터 형식으로 정의됩니다.This is defined as a tinyint data type.

DECLARE @returnstatus nvarchar(15);  
SET @returnstatus = NULL;  
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;  
PRINT @returnstatus;  
GO  

J.J. EXECUTE를 사용하여 연결된 서버의 Oracle 데이터베이스 쿼리Using EXECUTE to query an Oracle database on a linked server

다음 예에서는 원격 Oracle 서버에서 몇 가지 SELECT 문을 실행합니다.The following example executes several SELECT statements at the remote Oracle server. 먼저 Oracle 서버를 연결된 서버로 추가한 다음 연결된 서버 로그인을 만듭니다.The example begins by adding the Oracle server as a linked server and creating linked server login.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

-- Setup the linked server.  
EXEC sp_addlinkedserver    
        @server='ORACLE',  
        @srvproduct='Oracle',  
        @provider='OraOLEDB.Oracle',   
        @datasrc='ORACLE10';  
  
EXEC sp_addlinkedsrvlogin   
    @rmtsrvname='ORACLE',  
    @useself='false',   
    @locallogin=null,   
    @rmtuser='scott',   
    @rmtpassword='tiger';  
  
EXEC sp_serveroption 'ORACLE', 'rpc out', true;  
GO  
  
-- Execute several statements on the linked Oracle server.  
EXEC ( 'SELECT * FROM scott.emp') AT ORACLE;  
GO  
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;  
GO  
DECLARE @v INT;   
SET @v = 7902;  
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;  
GO   

11.K. EXECUTE AS USER를 사용하여 다른 사용자 컨텍스트로 전환Using EXECUTE AS USER to switch context to another user

다음 예에서는 테이블을 만들고 AS USER 절을 지정하여 문의 실행 컨텍스트를 호출자에서 User1로 전환하는 Transact-SQLTransact-SQL 문자열을 실행합니다.The following example executes a Transact-SQLTransact-SQL string that creates a table and specifies the AS USER clause to switch the execution context of the statement from the caller to User1. 데이터베이스 엔진Database Engine은 문이 실행될 때 User1의 사용 권한을 확인합니다.The 데이터베이스 엔진Database Engine will check the permissions of User1 when the statement is run. User1은 데이터베이스에 사용자로 존재해야 하며 Sales 스키마에서 테이블을 만들 수 있는 사용 권한이 있어야 합니다. 그렇지 않으면 문이 실행되지 않습니다.User1 must exist as a user in the database and must have permission to create tables in the Sales schema, or the statement fails.

EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID int, SalesName varchar(10));')  
AS USER = 'User1';  
GO  

12.L. EXECUTE 및 AT linked_server_name과 함께 매개 변수 사용Using a parameter with EXECUTE and AT linked_server_name

다음 예에서는 매개 변수에 물음표(?) 자리 표시자를 사용하여 원격 서버로 명령 문자열을 전달합니다.The following example passes a command string to a remote server by using a question mark (?) placeholder for a parameter. SQL ServerSQL Server의 다른 인스턴스를 가리키는 SeattleSales 연결된 서버를 만든 다음 이 연결된 서버에 대해 SELECT 문을 실행합니다.The example creates a linked server SeattleSales that points to another instance of SQL ServerSQL Server and executes a SELECT statement against that linked server. SELECT 문은 물음표를 ProductID 매개 변수(952)에 대한 자리 표시자로 사용합니다. 이 매개 변수는 문 다음에 입력합니다.The SELECT statement uses the question mark as a place holder for the ProductID parameter (952), which is provided after the statement.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

-- Setup the linked server.  
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'  
GO  
-- Execute the SELECT statement.  
EXECUTE ('SELECT ProductID, Name   
    FROM AdventureWorks2012.Production.Product  
    WHERE ProductID = ? ', 952) AT SeattleSales;  
GO  

13.M. EXECUTE를 사용하여 단일 결과 집합 다시 정의Using EXECUTE to redefine a single result set

이전의 일부 예에서는 EXEC dbo.uspGetEmployeeManagers 6;을 실행하여 7개의 열을 반환했습니다.Some of the previous examples executed EXEC dbo.uspGetEmployeeManagers 6; which returned 7 columns. 다음 예에서는 WITH RESULT SET 구문을 사용하여 반환되는 결과 집합의 이름과 데이터 형식을 변경하는 방법을 보여 줍니다.The following example demonstrates using the WITH RESULT SET syntax to change the names and data types of the returning result set.

적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 부터 SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database

EXEC 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.N. EXECUTE를 사용하여 두 결과 집합 다시 정의Using EXECUTE to redefine a two result sets

둘 이상의 결과 집합을 반환하는 문을 실행하는 경우 각 예상 결과 집합을 정의합니다.When executing a statement that returns more than one result set, define each expected result set. AdventureWorks2012AdventureWorks2012의 다음 예에서는 두 결과 집합을 반환하는 프로시저를 만듭니다.The following example in AdventureWorks2012AdventureWorks2012 creates a procedure that returns two result sets. 그런 다음, WITH RESULT SETS 절을 사용하고 두 결과 집합 정의를 지정하여 프로시저를 실행합니다.Then the procedure is executed using the WITH RESULT SETS clause, and specifying two result set definitions.

적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 부터 SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Azure SQL 데이터베이스Azure SQL Database

--Create the procedure  
CREATE PROC 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  
    JOIN Sales.SalesOrderDetail AS S  
        ON P.ProductID  = S.ProductID   
    WHERE Name LIKE @ProdName  
    GROUP BY Name;  
GO  
  
-- Execute the procedure   
EXEC Production.ProductList '%tire%'  
WITH RESULT SETS   
(  
    (ProductID int,   -- first result set definition starts here  
    Name Name,  
    ListPrice money)  
    ,                 -- comma separates result set definitions  
    (Name Name,       -- second result set definition starts here  
    NumberOfOrders int)  
);  
  

예제: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse병렬 데이터 웨어하우스Parallel Data WarehouseExamples: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse and 병렬 데이터 웨어하우스Parallel Data Warehouse

예제 O: 기본 프로시저 실행Example O: Basic Procedure Execution

저장 프로시저 실행:Executing a stored procedure:

EXEC proc1;  

런타임에 결정되는 이름으로 저장 프로시저 호출:Calling a stored procedure with name determined at runtime:

EXEC ('EXEC ' + @var);  

저장 프로시저 안에서 저장 프로시저 호출:Calling a stored procedure from within a stored procedure:

CREATE sp_first AS EXEC sp_second; EXEC sp_third;  

예제 P: 문자열 실행Example P: Executing Strings

SQL 문자열 실행:Executing a SQL string:

EXEC ('SELECT * FROM sys.types');  

중첩 문자열 실행:Executing a nested string:

EXEC ('EXEC (''SELECT * FROM sys.types'')');  

문자열 변수 실행:Executing a string variable:

DECLARE @stringVar nvarchar(100);  
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';  
EXEC (@stringVar);  

예제 Q: 매개 변수가 있는 프로시저Example Q: Procedures with Parameters

다음 예제에서는 매개 변수가 있는 프로시저를 만들고 3가지 방법으로 프로시저를 실행합니다.The following example creates a procedure with parameters and demonstrates 3 ways to execute the procedure:

-- Uses AdventureWorks  
  
CREATE PROC ProcWithParameters  
    @name nvarchar(50),  
@color nvarchar (15)  
AS   
SELECT ProductKey, EnglishProductName, Color FROM [dbo].[DimProduct]  
WHERE EnglishProductName LIKE @name  
AND Color = @color;  
GO  
  
-- Executing using positional parameters  
EXEC ProcWithParameters N'%arm%', N'Black';  
-- Executing using named parameters in order  
EXEC ProcWithParameters @name = N'%arm%', @color = N'Black';  
-- Executing using named parameters out of order  
EXEC ProcWithParameters @color = N'Black', @name = N'%arm%';  
GO  

참고 항목See Also

@@NESTLEVEL&#40;Transact-SQL&#41; @@NESTLEVEL (Transact-SQL)
DECLARE @local_variable&#40;Transact-SQL&#41; DECLARE @local_variable (Transact-SQL)
EXECUTE AS 절(Transact-SQL) EXECUTE AS Clause (Transact-SQL)
osql Utility osql Utility
보안 주체(데이터베이스 엔진) Principals (Database Engine)
REVERT (Transact-SQL) REVERT (Transact-SQL)
sp_addlinkedserver(Transact-SQL) sp_addlinkedserver (Transact-SQL)
sqlcmd 유틸리티 sqlcmd Utility
SUSER_NAME (Transact-SQL) SUSER_NAME (Transact-SQL)
sys.database_principals(Transact-SQL) sys.database_principals (Transact-SQL)
sys.server_principals(Transact-SQL) sys.server_principals (Transact-SQL)
USER_NAME (Transact-SQL) USER_NAME (Transact-SQL)
OPENDATASOURCE(Transact-SQL) OPENDATASOURCE (Transact-SQL)
메모리 내 OLTP에 대한 사용자 정의 스칼라 함수Scalar User-Defined Functions for In-Memory OLTP