ネイティブ コンパイル T-SQL モジュールでサポートされる機能Supported Features for Natively Compiled T-SQL Modules

適用対象: ○SQL Server ○Azure SQL Database XAzure Synapse Analytics (SQL DW) XParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

このトピックには、T-SQL 領域とネイティブ コンパイル T-SQL モジュールの本体でサポートされる機能が含まれています。ストアド プロシージャ (CREATE PROCEDURE (Transact-SQL))、スカラー ユーザー定義機能、インライン テーブル値関数、トリガーなどです。This topic contains a list of T-SQL surface area and supported features in the body of natively compiled T-SQL modules, such as stored procedures (CREATE PROCEDURE (Transact-SQL)), scalar user-defined functions, inline table-valued functions, and triggers.

ネイティブ モジュールの定義でサポートされる機能については、「 ネイティブ コンパイル T-SQL モジュールでサポートされる DDL」をご覧ください。For supported features around the definition of native modules, see Supported DDL for Natively Compiled T-SQL modules.

サポートされない構造に関する詳細と、ネイティブ コンパイル モジュールのサポートされない一部の機能に対処する方法については、「 Migration Issues for Natively Compiled Stored Procedures」を参照してください。For complete information about unsupported constructs, and for information about how to work around some of the unsupported features in natively compiled modules, see Migration Issues for Natively Compiled Stored Procedures. サポートされていない機能の詳細については、「 インメモリ OLTP でサポートされていない Transact-SQL の構造」をご覧ください。For more information about unsupported features, see Transact-SQL Constructs Not Supported by In-Memory OLTP.

ネイティブ モジュールのクエリ領域Query Surface Area in Native Modules

次のクエリ構造がサポートされます。The following query constructs are supported:

CASE 式: CASE は、有効な式を使用できる任意のステートメントや句で使用できます。CASE expression: CASE can be used in any statement or clause that allows a valid expression.

  • 適用対象: SQL Server 2017 (14.x)SQL Server 2017 (14.x)Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x).
    SQL Server 2017 (14.x)SQL Server 2017 (14.x) 以降、CASE ステートメントはネイティブ コンパイル T-SQL モジュールに対してサポートされています。Beginning with SQL Server 2017 (14.x)SQL Server 2017 (14.x), CASE statements are now supported for natively compiled T-SQL modules.

SELECT 句:SELECT clause:

  • 列と名前のエイリアス (AS または = 構文を使用)。Columns and name aliases (using either AS or = syntax).

  • スカラー サブクエリScalar subqueries

    • 適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x)Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x). SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降、スカラー サブクエリはネイティブ コンパイル モジュールでサポートされています。Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x), scalar subqueries are now supported in natively compiled modules.
  • TOP*TOP*

  • SELECT DISTINCTSELECT DISTINCT

    • 適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x)Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x). SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降、DISTINCT 演算子はネイティブ コンパイル モジュールでサポートされています。Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the DISTINCT operator is supported in natively compiled modules.

          DISTINCT aggregates are not supported.  
      
  • UNION および UNION ALLUNION and UNION ALL

    • 適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x)Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x). SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降、UNION および UNION ALL 演算子はネイティブ コンパイル モジュールでサポートされています。Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x), UNION and UNION ALL operators are now supported in natively compiled modules.
  • 変数割り当てVariable assignments

FROM 句:FROM clause:

  • FROM <メモリ最適化テーブルまたはテーブル変数>FROM <memory optimized table or table variable>

  • FROM <ネイティブ コンパイル インライン TVF>FROM <natively compiled inline TVF>

  • LEFT OUTER JOIN、RIGHT OUTER JOIN、CROSS JOIN、INNER JOIN。LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN and INNER JOIN.

    • 適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x)Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x). SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降、JOINS はネイティブ コンパイル モジュールでサポートされています。Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x), JOINS are now supported in natively compiled modules.
  • サブクエリ [AS] table_aliasSubqueries [AS] table_alias. 詳細については、「FROM (Transact-SQL)」を参照してください。For more information, see FROM (Transact-SQL).

    • 適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x)Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x). SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降、サブクエリはネイティブ コンパイル モジュールでサポートされています。Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x), Subqueries are now supported in natively compiled modules.

WHERE 句:WHERE clause:

  • フィルター述語 IS [NOT] NULLFilter predicate IS [NOT] NULL

  • AND、BETWEENAND, BETWEEN

  • OR、NOT、IN、EXISTSOR, NOT, IN, EXISTS

    • 適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x)Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x). SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降、OR/NOT/IN/EXISTS 演算子はネイティブ コンパイル モジュールでサポートされています。Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x), OR/NOT/IN/EXISTS operators are now supported in natively compiled modules.

GROUP BY 句:GROUP BY clause:

  • 集計関数 AVG、COUNT、COUNT_BIG、MIN、MAX、SUM。Aggregate functions AVG, COUNT, COUNT_BIG, MIN, MAX, and SUM.

  • MIN および MAX は、nvarchar、char、varchar、varchar、varbinary、および binary 型ではサポートされていません。MIN and MAX are not supported for types nvarchar, char, varchar, varchar, varbinary, and binary.

ORDER BY 句:ORDER BY clause:

  • ORDER BY 句での DISTINCT のサポートはありません。There is no support for DISTINCT in the ORDER BY clause.

  • ORDER BY リスト内の式が GROUP BY (Transact-SQL) リスト内にもそのまま出現する場合は、GROUP BY でサポートされます。Is supported with GROUP BY (Transact-SQL) if an expression in the ORDER BY list appears verbatim in the GROUP BY list.

    • たとえば、GROUP BY a + b ORDER BY a + b はサポートされますが、GROUP BY a, b ORDER BY a + b はサポートされません。For example, GROUP BY a + b ORDER BY a + b is supported, but GROUP BY a, b ORDER BY a + b is not.

HAVING 句:HAVING clause:

  • WHERE 句と同じ式の制限が適用されます。Is subject to the same expression limitations as the WHERE clause.

ORDER BY と TOP はネイティブ コンパイル モジュールでサポートされますが、いくつかの制限があります。ORDER BY and TOP are supported in natively compiled modules, with some restrictions

  • WITH TIES 句での PERCENT または TOP のサポートはありません。There is no support for WITH TIES or PERCENT in the TOP clause.

  • ORDER BY 句での DISTINCT のサポートはありません。There is no support for DISTINCT in the ORDER BY clause.

  • TOPORDER BY の組み合わせでは、 TOP 句内で定数を使用するときに 8,192 を超える値はサポートされません。TOP combined with ORDER BY does not support more than 8,192 when using a constant in the TOP clause.

    • クエリに結合または集計関数が含まれている場合は、この制限値がさらに小さくなる場合がありますThis limit may be lowered in case the query contains joins or aggregate functions. (たとえば、1 回の結合 (2 つのテーブル) では、制限値は 4,096 行です。(For example, with one join (two tables), the limit is 4,096 rows. 2 回の結合 (3 つのテーブル) では、制限値は 2,730 行です)。With two joins (three tables), the limit is 2,730 rows.)
    • 変数内に行の数を格納すると、8,192 より多くの結果を取得できます。You can obtain results greater than 8,192 by storing the number of rows in a variable:
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...

ただし、変数を使用する場合に比べて、 TOP 句内で定数を使用する方がパフォーマンスが向上する結果になります。However, a constant in the TOP clause results in better performance compared to using a variable.

ネイティブにコンパイルされる Transact-SQLTransact-SQL でのこれらの制限は、インタープリターによって処理される Transact-SQLTransact-SQL によるメモリ最適化テーブルへのアクセスには適用されません。These restrictions on natively compiled Transact-SQLTransact-SQL do not apply to interpreted Transact-SQLTransact-SQL access on memory-optimized tables.

データの変更Data Modification

以下の DML ステートメントがサポートされています。The following DML statements are supported.

  • INSERT VALUES (ステートメントごとに 1 行) と INSERT ...SELECTINSERT VALUES (one row per statement) and INSERT ... SELECT

  • UPDATEUPDATE

  • DELETEDELETE

  • WHERE は UPDATE ステートメントと DELETE ステートメントでサポートされています。WHERE is supported with UPDATE and DELETE statements.

フロー制御言語Control-of-flow language

次のフロー制御言語構成がサポートされています。The following control-of-flow language constructs are supported.

サポートされている演算子Supported Operators

サポートされている演算子は次のとおりです。The following operators are supported.

  • 比較演算子 (Transact-SQL) (例: >、<、>=、<=)Comparison Operators (Transact-SQL) (for example, >, <, >=, and <=)

  • 単項演算子 (+、-)。Unary operators (+, -).

  • 二項演算子 (*、/、+、-、% (剰余))。Binary operators (*, /, +, -, % (modulo)).

           The plus operator (+) is supported on both numbers and strings.  
    
  • 論理演算子 (AND、OR、NOT)。Logical operators (AND, OR, NOT).

  • ビット演算子 ~、&、|、および ^Bitwise operators ~, &, |, and ^

  • APPLY 演算子APPLY operator

    • 適用対象: SQL Server 2017 (14.x)SQL Server 2017 (14.x)Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x).
      SQL Server 2017 (14.x)SQL Server 2017 (14.x) 以降では、ネイティブ コンパイル モジュールで APPLY 演算子がサポートされます。Beginning with SQL Server 2017 (14.x)SQL Server 2017 (14.x), the APPLY operator is supported in natively compiled modules.

ネイティブ コンパイル モジュールの組み込み関数Built-in Functions in Natively Compiled Modules

メモリ最適化テーブルの構造とネイティブ コンパイル T-SQL モジュールでは、次の関数がサポートされます。The following functions are supported in constraints on memory-optimized tables and in natively compiled T-SQL modules.

  • すべての数学関数 (Transact-SQL)All Mathematical Functions (Transact-SQL)

  • 日付関数: CURRENT_TIMESTAMP、DATEADD、DATEDIFF、DATEFROMPARTS、DATEPART、DATETIME2FROMPARTS、DATETIMEFROMPARTS、DAY、EOMONTH、GETDATE、GETUTCDATE、MONTH、SMALLDATETIMEFROMPARTS、SYSDATETIME、SYSUTCDATETIME、および YEARDate functions: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME, and YEAR.

  • 文字列関数: LEN、LTRIM、RTRIM、および SUBSTRING。String functions: LEN, LTRIM, RTRIM, and SUBSTRING.

    • 適用対象: SQL Server 2017 (14.x)SQL Server 2017 (14.x)Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x).
      SQL Server 2017 (14.x)SQL Server 2017 (14.x) 以降では、組み込み関数の TRIM、TRANSLATE、CONCAT_WS もサポートされます。Beginning with SQL Server 2017 (14.x)SQL Server 2017 (14.x), the following built-in functions are also supported: TRIM, TRANSLATE, and CONCAT_WS.
  • ID 関数: SCOPE_IDENTITYIdentity functions: SCOPE_IDENTITY

  • NULL 関数: ISNULLNULL functions: ISNULL

  • Uniqueidentifier 関数: NEWID および NEWSEQUENTIALIDUniqueidentifier functions: NEWID and NEWSEQUENTIALID

  • JSON 関数JSON functions

    • 適用対象: SQL Server 2017 (14.x)SQL Server 2017 (14.x)Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x).
      SQL Server 2017 (14.x)SQL Server 2017 (14.x) 以降では、ネイティブ コンパイル モジュールで JSON 関数がサポートされます。Beginning with SQL Server 2017 (14.x)SQL Server 2017 (14.x), the JSON functions are supported in natively compiled modules.
  • エラー関数: ERROR_LINE、ERROR_MESSAGE、ERROR_NUMBER、ERROR_PROCEDURE、ERROR_SEVERITY、および ERROR_STATEError functions: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, and ERROR_STATE

  • システム関数: @@rowcount。System Functions: @@rowcount. ネイティブ コンパイル ストアド プロシージャ内のステートメントによって、@@rowcount が更新されます。ネイティブ コンパイル ストアド プロシージャ内で @@rowcount を使用し、ネイティブ コンパイル ストアド プロシージャ内で実行された最後のステートメントによる影響を受けた行の数を決定することができます。Statements inside natively compiled stored procedures update @@rowcount and you can use @@rowcount in a natively compiled stored procedure to determine the number of rows affected by the last statement executed within that natively compiled stored procedure. ただし、ネイティブ コンパイル ストアド プロシージャの実行の開始時および終了時に、@@rowcount は 0 にリセットされます。However, @@rowcount is reset to 0 at the start and at the end of the execution of a natively compiled stored procedure.

  • セキュリティ関数: IS_MEMBER({'group' | 'role'})、IS_ROLEMEMBER ('role' [、'database_principal'])、IS_SRVROLEMEMBER ('role' [, 'login'])、ORIGINAL_LOGIN()、SESSION_USER、CURRENT_USER、SUSER_ID(['login'])、SUSER_SID(['login'] [, Param2])、SUSER_SNAME([server_user_sid])、SYSTEM_USER、SUSER_NAME、USER、USER_ID(['user'])、USER_NAME([id])、CONTEXT_INFO()。Security functions: IS_MEMBER({'group' | 'role'}), IS_ROLEMEMBER ('role' [, 'database_principal']), IS_SRVROLEMEMBER ('role' [, 'login']), ORIGINAL_LOGIN(), SESSION_USER, CURRENT_USER, SUSER_ID(['login']), SUSER_SID(['login'] [, Param2]), SUSER_SNAME([server_user_sid]), SYSTEM_USER, SUSER_NAME, USER, USER_ID(['user']), USER_NAME([id]), CONTEXT_INFO().

  • ネイティブ モジュールの実行は入れ子にすることができます。Executions of native modules can be nested.

監査Auditing

プロシージャ レベルの監査はネイティブ コンパイル ストアド プロシージャでサポートされています。Procedure level auditing is supported in natively compiled stored procedures.

監査の詳細については、「 Create a Server Audit and Database Audit Specification」を参照してください。For more information about auditing, see Create a Server Audit and Database Audit Specification.

テーブル ヒントとクエリ ヒントTable and Query Hints

サポート対象は次のとおりです。The following are supported:

詳細については、「クエリ ヒント (Transact-SQL)」を参照してください。For more information, see Query Hints (Transact-SQL).

並べ替えに関する制限事項Limitations on Sorting

TOP (Transact-SQL) および ORDER BY 句 (Transact-SQL) を使用するクエリでは、8,000 を超える行の並べ替えを行うことができます。You can sort greater than 8,000 rows in a query that uses TOP (Transact-SQL) and an ORDER BY Clause (Transact-SQL). ただし、ORDER BY 句 (Transact-SQL) を使用しない場合、TOP (Transact-SQL) で並べ替えができる行数は最大で 8,000 です (結合がある場合は、より少ない行数になります)。However, without ORDER BY Clause (Transact-SQL), TOP (Transact-SQL) can sort up to 8,000 rows (fewer rows if there are joins).

クエリが TOP (Transact-SQL) 演算子および ORDER BY 句 (Transact-SQL) を使用する場合、TOP 演算子には 8192 行まで指定できます。If your query uses both the TOP (Transact-SQL) operator and an ORDER BY Clause (Transact-SQL), you can specify up to 8192 rows for the TOP operator. 8192 行を超える行を指定すると、"メッセージ 41398、レベル 16、状態 1、プロシージャ <procedureName> 、行 <lineNumber> TOP 演算子は、最大 8192 行を返すことができます。 <number> が要求されました" というエラー メッセージが表示されます。If you specify more than 8192 rows you get the error message: Msg 41398, Level 16, State 1, Procedure <procedureName>, Line <lineNumber> The TOP operator can return a maximum of 8192 rows; <number> was requested.

TOP 句がない場合は、ORDER BY で任意の数の行を並べ替えることができます。If you do not have a TOP clause, you can sort any number of rows with ORDER BY.

ORDER BY 句を使用しない場合、TOP 演算子と共に任意の整数値を使用できます。If you do not use an ORDER BY clause, you can use any integer value with the TOP operator.

TOP N = 8192 の例: コンパイルExample with TOP N = 8192: Compiles

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8192 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

TOP N > 8192 の例: コンパイルは失敗します。Example with TOP N > 8192: Fails to compile.

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8193 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

8192 行の制限は、 TOP N が定数の場合に、前の例のように、 N にのみ適用されます。The 8192 row limitation only applies to TOP N where N is a constant, as in the preceding examples. 8192 より大きな N が必要である場合は、値を変数に割り当て、 TOPと共にその変数を使用することができます。If you need N greater than 8192 you can assign the value to a variable and use that variable with TOP.

変数を使用した例: コンパイルExample using a variable: Compiles

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    DECLARE @v int = 8193   
    SELECT TOP (@v) ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

返される行に関する制限事項: TOP 演算子から返される行数を減らせる可能性がある場合が 2 つあります。Limitations on rows returned: There are two cases where that can potentially reduce the number of rows that can be returned by the TOP operator:

  • クエリで JOIN を使用します。Using JOINs in the query. 制限における JOIN の影響は、クエリ プランによって異なります。The influence of JOINs on the limitation depends on the query plan.

  • ORDER BY 句で集計関数または集計関数への参照を使用する。Using aggregate functions or references to aggregate functions in the ORDER BY clause.

TOP N での最悪のケースでサポートされる最大 N を計算する式は次のとおりです: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )The formula to calculate a worst case maximum supported N in TOP N is: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

参照See Also

ネイティブ コンパイル ストアド プロシージャ Natively Compiled Stored Procedures
ネイティブ コンパイル ストアド プロシージャの移行に関する問題Migration Issues for Natively Compiled Stored Procedures