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

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

В этом разделе содержится список компонентов контактной зоны T-SQL и поддерживаемых функций в тексте модулей, скомпилированных в собственном коде T-SQL, например хранимых процедур (CREATE PROCEDURE (Transact-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 <native compiled inline TVF>

  • 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

  • AND, BETWEEN

  • OR, NOT, IN, EXISTS

    • Область применения: 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 не поддерживает более 8192 строк при использовании константы в предложении 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().

  • Выполнение собственных модулей может быть вложенным.

Аудит

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

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

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

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

Дополнительные сведения см. в разделе Указания запросов (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> The TOP operator может возвращать не более 8192 строк; <запрошено число>.

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

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

Пример для оператора TOP с числом значений 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:

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

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

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

См. также

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