Поддерживаемые функции для модулей, скомпилированных в собственном коде T-SQLSupported Features for Natively Compiled T-SQL Modules

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES 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.

Дополнительные сведения о поддерживаемых функциях в определении исходных модулей см. в разделе Поддерживаемые конструкции DDL для модулей, скомпилированных в собственном коде T-SQL.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. Дополнительные сведения о неподдерживаемых компонентах см. в разделе Конструкции языка Transact-SQL, неподдерживаемые в In-Memory OLTP.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), для модулей, скомпилированных в собственном коде T-SQL, поддерживаются выражения CASE.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), для модулей, скомпилированных в собственном коде T-SQL, поддерживаются скалярные подзапросы.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 <скомпилированные_в_собственном_коде_встроенные_функции_с_табличными_значениями>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_alias.Subqueries [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:

  • DISTINCT не поддерживается в предложении ORDER BY .There is no support for DISTINCT in the ORDER BY clause.

  • Поддерживается с GROUP BY (Transact-SQL), если выражение в списке ORDER BY появляется дословно в списке 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.

  • DISTINCT не поддерживается в предложении ORDER BY .There is no support for DISTINCT in the ORDER BY clause.

  • TOP совместно с ORDER BY не поддерживает более 8192 строк при использовании константы в предложении TOP .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. (Например, с одним соединением (двумя таблицами) ограничение составляет 4 096 строк.(For example, with one join (two tables), the limit is 4,096 rows. С двумя соединениями (тремя таблицами) ограничение равно 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 (по одной строке на каждую инструкцию) и 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 и YEAR.Date 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.
  • Функции идентификации: SCOPE_IDENTITYIdentity functions: SCOPE_IDENTITY

  • Функции для работы со значением NULL: ISNULLNULL functions: ISNULL

  • Функции уникальных идентификаторов: NEWID и NEWSEQUENTIALIDUniqueidentifier functions: NEWID and NEWSEQUENTIALID

  • Функции JSONJSON 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.

Дополнительные сведения об аудите см. в разделе Создание спецификация аудита для сервера и базы данных.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, процедура <имя_процедуры> , строка <номер_строки> . Оператор TOP может возвратить не более 8192 строк; запрошенное число: <число> .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 с числом значений 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 с числом значений > 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. Если нужно, чтобы N было больше 8192, можно присвоить это значение переменной и использовать ее с оператором 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.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:

  • Использование соединений в запросе.Using JOINs in the query. Влияние соединений на ограничения зависит от плана запроса.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.

Формула для вычисления наименьшего поддерживаемого значения N в предложении TOP 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