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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

В этом разделе содержится список функциональных возможностей T-SQL и поддерживаемых возможностей в теле модулей T-SQL, компилируемых в машинный код, таких как хранимые процедуры (CREATE PROCEDURETransact-SQL), скалярные пользовательские функции, встроенные табличнозначные функции и триггеры.

Сведения о поддерживаемых возможностях при определении модулей, скомпилированных в собственном коде, см. в разделе Поддерживаемые конструкции DDL для модулей, скомпилированных в собственном коде T-SQL.

Полные сведения о неподдерживаемых конструкциях и о том, как обойти некоторые неподдерживаемые функции в модулях, скомпилированных в собственном коде, см. в разделе Migration Issues for Natively Compiled Stored Procedures. Дополнительные сведения о неподдерживаемых компонентах см. в разделе Конструкции языка Transact-SQL, неподдерживаемые в In-Memory OLTP.

Область запросов в нативных модулях

Здесь приведены поддерживаемые конструкции запросов.

Выражение CASE: выражение CASE можно включать в любую инструкцию или предложение, которые позволяют использовать допустимые выражения.

  • Область применения: SQL Server 2017 (14.x).
    Начиная с SQL Server 2017 (14.x), операторы CASE теперь поддерживаются в изначально компилируемых модулях T-SQL.

Предложение SELECT:

  • псевдонимы имен и столбцов (с помощью синтаксиса AS или =);

  • скалярные подзапросы

    • Область применения: SQL Server 2016 (13.x). Начиная с SQL Server 2016 (13.x), в модулях с собственной компиляцией теперь поддерживаются скалярные вложенные запросы.
  • TOP*

  • SELECT DISTINCT

    • Область применения: SQL Server 2016 (13.x). Начиная с SQL Server 2016 (13.x), оператор DISTINCT поддерживается в модулях с собственной компиляцией.

      • статистические выражения с оператором DISTINCT не поддерживаются;
  • UNION и UNION ALL

    • Область применения: SQL Server 2016 (13.x). Начиная с SQL Server 2016 (13.x), операторы UNION и UNION ALL теперь поддерживаются в модулях, компилируемых в машинный код.
  • Присваивание значений переменным

Предложение FROM:

  • ИЗ <таблицы, оптимизированной для памяти, или табличной переменной>

  • FROM <встроенной табличной функции, скомпилированной в собственный код>

  • LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN и INNER JOIN.

    • Область применения: SQL Server 2016 (13.x). Начиная с SQL Server 2016 (13.x), JOINS теперь поддерживаются в модулях, компилируемых в собственный код.
  • Подзапросы [AS] table_alias. Дополнительные сведения см. в разделе FROM (Transact-SQL).

    • Область применения: SQL Server 2016 (13.x). Начиная с SQL Server 2016 (13.x), подзапросы поддерживаются в модулях, компилируемых в машинный код.

Условие WHERE:

  • Предикат фильтрации IS [NOT] NULL

  • И, МЕЖДУ

  • ИЛИ, НЕТ, В, СУЩЕСТВУЕТ

    • Область применения: SQL Server 2016 (13.x). Начиная с версии SQL Server 2016 (13.x), операторы OR/NOT/IN/EXISTS теперь поддерживаются в модулях, компилируемых в машинный код.

предложение GROUP BY:

  • Агрегатные функции: AVG, COUNT, COUNT_BIG, MIN, MAX и SUM.

  • Функции MIN и MAX не поддерживаются для типов nvarchar, char, varchar, varchar, varbinary и binary.

ORDER BY: предложение

  • DISTINCT не поддерживается в предложении ORDER BY .

  • Поддерживается с GROUP BY (Transact-SQL), если выражение из списка ORDER BY присутствует в списке GROUP BY в точности в том же виде.

    • Например, конструкция GROUP BY a + b ORDER BY a + b поддерживается, а конструкция GROUP BY a, b ORDER BY a + b — нет.

Предложение HAVING:

  • С соблюдением тех же ограничений, что и в предложении WHERE.

Операторы ORDER BY и TOP поддерживаются в нативно компилируемых модулях с некоторыми ограничениями

  • Не поддерживаются WITH TIES и PERCENT в предложении TOP .

  • DISTINCT не поддерживается в предложении ORDER BY .

  • TOP в сочетании с ORDER BY не поддерживает значение более 8 192 при использовании константы в предложении TOP.

    • Это ограничение может быть понижено в случае, если запрос содержит соединения или агрегатные функции. (Например, с одним соединением (двумя таблицами) ограничение составляет 4 096 строк. С двумя соединениями (тремя таблицами) ограничение равно 2 730 строкам.)
    • Результаты более 8 192 можно получить, сохраняя в переменной несколько строк.
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...

Однако константа в предложении TOP обеспечивает лучшую производительность, чем при использовании переменной.

Эти ограничения для скомпилированных в собственном коде Transact-SQL не применяются к интерпретированному доступу Transact-SQL к таблицам, оптимизированным для памяти.

Изменение данных

Поддерживаются следующие инструкции DML:

  • INSERT VALUES (одна строка на инструкцию) и INSERT ... SELECT

  • UPDATE

  • DELETE

  • WHERE поддерживается операторами UPDATE и DELETE.

Язык управления потоком

Поддерживаются следующие конструкции языка управления потоком:

Поддерживаемые операторы

Поддерживаются следующие операторы.

  • Операторы сравнения (Transact-SQL) (например, >, <>=и <=)

  • Унарные операторы (+, -).

  • Двоичные операторы (*, /, +, -, % (остаток от деления)).

    • Оператор плюс (+) поддерживается как для чисел, так и в строках.
  • Логические операторы (AND, OR, NOT).

  • Битовые операторы ~, &, |, и ^

  • оператор APPLY

    • Область применения: SQL Server 2017 (14.x).
      Начиная с SQL Server 2017 (14.x), оператор APPLY поддерживается в модулях, компилируемых в собственный код.

Встроенные функции в модулях, скомпилированных в собственном коде

В ограничениях таблиц, оптимизированных для памяти, и в модулях, скомпилированных в собственном коде T-SQL, поддерживаются следующие функции.

  • Все математические функции (Transact-SQL)

  • Функции для работы с датами: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME и YEAR.

  • Строковые функции: LEN, LTRIM, RTRIM и SUBSTRING.

    • Область применения: SQL Server 2017 (14.x).
      Начиная с SQL Server 2017 (14.x), также поддерживаются следующие встроенные функции: TRIM, TRANSLATE и CONCAT_WS.
  • Функции идентификации: SCOPE_IDENTITY.

  • NULL-функции: ISNULL

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

  • Функции JSON

    • Область применения: SQL Server 2017 (14.x).
      Начиная с SQL Server 2017 (14.x), функции JSON поддерживаются в скомпилированных модулях в собственном коде.
  • Функции обработки ошибок: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY и ERROR_STATE.

  • Системные функции: @@rowcount. Инструкции в хранимых процедурах, скомпилированных в машинный код, обновляют @@rowcount, и вы можете использовать @@rowcount в хранимой процедуре, скомпилированной в машинный код, чтобы определить число строк, затронутых последней инструкцией, выполненной в этой хранимой процедуре. Однако @@rowcount сбрасывается до 0 в начале и в конце выполнения хранимой процедуры, компилируемой в машинный код.

  • Функции безопасности: 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().

  • Нативные модули могут выполняться вложенно.

Аудит

Аудит на уровне процедуры поддерживается для хранимых процедур, скомпилированных в собственном коде.

Дополнительные сведения об аудите см. в разделе Создание спецификация аудита для сервера и базы данных.

Табличные подсказки и подсказки запросов

Поддерживаются следующие:

  • INDEX, а также подсказки FORCESCAN и FORCESEEK, либо в синтаксисе табличных подсказок, либо в предложении OPTION (Transact-SQL) запроса. Дополнительные сведения см. в статье Указания по таблицам (Transact-SQL).

  • ПРИНУДИТЕЛЬНЫЙ ПОРЯДОК

  • подсказка LOOP JOIN

  • ОПТИМИЗАЦИЯ ДЛЯ

Дополнительные сведения см. в разделе Указания запросов (Transact-SQL).

Ограничения на сортировку

Вы можете сортировать более 8 000 строк в запросе, использующего TOP (Transact-SQL) и предложение ORDER BY (Transact-SQL). Однако без предложения ORDER BY (Transact-SQL) TOP (Transact-SQL) может сортировать до 8000 строк (меньше строк при наличии соединений).

Если запрос использует оператор TOP (Transact-SQL) и предложение ORDER BY (Transact-SQL), можно указать до 8192 строк для оператора TOP. Если указать более 8192 строк, вы получите сообщение об ошибке: Msg 41398, Level 16, State 1, Procedure <procedureName>, Line <lineNumber> Оператор TOP может вернуть не более 8192 строк; было запрошено <number>.

Если отсутствует предложение TOP, то можно отсортировать любое количество строк с помощью предложения ORDER BY.

Если не используется предложение ORDER BY, то можно использовать любое целочисленное значение с оператором TOP.

Пример с TOP N = 8192: компиляции

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: не удалось скомпилировать.

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

Пример использования переменной: компиляция

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:

  • Использование JOIN в запросе. Влияние операций JOIN на ограничение зависит от плана выполнения запроса.

  • Использование агрегатных функций или ссылки на агрегатные функции в предложении ORDER BY.

Формула для вычисления максимального поддерживаемого значения N в наихудшем случае в конструкции TOP N имеет вид: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

См. также

Скомпилированные в собственном коде хранимые процедуры
Проблемы миграции, связанные с хранимыми процедурами, скомпилированными в собственном коде