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

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server 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 2017Applies 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. パラメーター名の先頭にはアット マーク (@) を付ける必要があります。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 として value を定義した場合、対応する @parameter に対して、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 パラメーターを使用し、呼び出し元のバッチまたはモジュール内の他のステートメントで戻り値を使用する場合は、パラメーターの値を @parameter = @variable のように変数として渡す必要があります。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) 型を指定することはできません。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_variable には、charvarcharnchar、または 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_string には、nvarchar または 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 2017Applies 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 database ステートメントや分散クエリ、3 部または 4 部構成の識別子を使用する別のデータベースを参照するクエリなどは実行しないでください。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.

[?][?]
パススルー コマンドの <arg-list> で値が提供されるパラメーターを表します。このパススルー コマンドは、EXEC('...', <arg-list>) AT <linkedsrv> ステートメントで使用されるものです。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 2017Applies 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. RESULT SETS オプションは INSERT...EXEC ステートメントで指定できません。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. 4 部構成のオブジェクト名が指定されている場合、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 2017Azure SQL データベースAzure SQL DatabaseApplies 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_option を指定しない場合は、RESULT SETS UNDEFINED が既定の動作となります。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 2017Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Azure SQL データベースAzure SQL Database.

実行ステートメントによって結果が一切返されなくなります。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 2017Azure SQL データベースAzure SQL DatabaseApplies 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 2017Azure 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 および 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.

実行中に返される実際の結果セットは、結果セットの数、列の数、列の名前、NULL 値の許容属性、およびデータ型のいずれかが WITH RESULT SETS 句を使用して定義された結果とは異なる場合があります。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.

1 つのモジュールで、別のモジュールが呼び出されるか、共通言語ランタイム (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 システム関数に格納されます。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 では、varchar(max) 型と nvarchar(max) 型を指定でき、2 GB までの文字列データを使用できるようになりました。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 ステートメントは、モジュール内に含まれている場合でも、検出されるたびに権限が確認されます。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. ただし、呼び出すモジュールと呼び出されるモジュールを所有するユーザーが同じ場合、2 番目のモジュールに対しては 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 句 (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

A.A. EXECUTE を使用して 1 つのパラメーターを渡すUsing EXECUTE to pass a single parameter

AdventureWorks2012AdventureWorks2012 データベースの uspGetEmployeeManagers ストアド プロシージャでは、1 つのパラメーター (@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  

B.B. 複数のパラメーターを使用するUsing multiple parameters

次の例では、AdventureWorks2012AdventureWorks2012 データベースで spGetWhereUsedProductID ストアド プロシージャを実行します。The following example executes the spGetWhereUsedProductID stored procedure in the AdventureWorks2012AdventureWorks2012 database. ここでは、製品 ID (819) と、@CheckDate, 型の値をとる datetime の、2 つのパラメーターを引き渡します。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. この例では、tables_cursor カーソルを作成します。このカーソルは、AdventureWorks2012AdventureWorks2012 データベース内にあるすべてのユーザー定義テーブルの一覧を保持しています。次にその一覧を使用して、テーブルに対してすべてのインデックスを再構築します。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

次の例では、リモート サーバー SQLSERVER1uspGetEmployeeManagers ストアド プロシージャを実行し、@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 2017Applies 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. EXECUTE を DEFAULT と共に使用するUsing EXECUTE with DEFAULT

次の例では、第 1 および第 3 パラメーターに既定値を指定して、ストアド プロシージャを作成します。The following example creates a stored procedure with default values for the first and third parameters. プロシージャを実行するとき、値を指定しなかったり、既定値が指定されていた場合は、これらの既定値が第 1 および第 3 パラメーターに挿入されます。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. EXECUTE を AT linked_server_name と共に使用する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 2017Applies 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  

I.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. この関数には 1 つの入力パラメーター @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

次の例では、いくつかの SELECT ステートメントを、リモートの Oracle サーバーで実行します。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 2017Applies 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   

K.K. EXECUTE AS USER を使用して、コンテキストを別のユーザーに切り替えるUsing EXECUTE AS USER to switch context to another user

次の例では、テーブルを作成する Transact-SQLTransact-SQL 文字列を実行し、AS USER 句を指定して、ステートメントの実行コンテキストを呼び出し元から User1 に切り替えます。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  

L.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 2017Applies 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  

M.M. EXECUTE を使用して単一の結果セットを再定義するUsing EXECUTE to redefine a single result set

前のいくつかの例では、7 つの列を返す EXEC dbo.uspGetEmployeeManagers 6; を実行しました。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 2017Azure SQL データベースAzure SQL DatabaseApplies 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 )  
);  
  

N.N. EXECUTE を使用して 2 つの結果セットを再定義する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 の次の例では、2 つの結果セットを返すプロシージャを作成します。The following example in AdventureWorks2012AdventureWorks2012 creates a procedure that returns two result sets. 作成したプロシージャはその後 WITH RESULT SETS 句を使用して実行され、2 つの結果セットの定義が指定されます。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 2017Azure SQL データベースAzure SQL DatabaseApplies 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 WarehouseParallel Data WarehouseExamples: Azure SQL データ ウェアハウスAzure SQL Data Warehouse and Parallel Data WarehouseParallel 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 (Transact-SQL) @@NESTLEVEL (Transact-SQL)
DECLARE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
EXECUTE AS 句 (Transact-SQL) EXECUTE AS Clause (Transact-SQL)
osql ユーティリティ 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