Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: 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.
Язык управления потоком
Поддерживаются следующие конструкции языка управления потоком:
DECLARE @local_variable (Transact-SQL) можно использовать все поддерживаемые типы данных для OLTP в памяти, а также оптимизированные для памяти типы таблиц. Переменные могут быть объявлены как NULL или NOT NULL.
-
- Чтобы достичь оптимальной производительности, используйте один блок TRY/CATCH для всего модуля, скомпилированного в собственном коде T-SQL;
BEGIN ATOMIC (на внешнем уровне хранимой процедуры). Дополнительные сведения см. в разделе Atomic Blocks.
Поддерживаемые операторы
Поддерживаются следующие операторы.
Операторы сравнения (Transact-SQL) (например, >, <>=и <=)
Унарные операторы (+, -).
Двоичные операторы (*, /, +, -, % (остаток от деления)).
- Оператор плюс (+) поддерживается как для чисел, так и в строках.
Логические операторы (AND, OR, NOT).
Битовые операторы ~, &, |, и ^
оператор APPLY
-
Область применения: SQL Server 2017 (14.x).
Начиная с SQL Server 2017 (14.x), оператор APPLY поддерживается в модулях, компилируемых в собственный код.
-
Область применения: SQL Server 2017 (14.x).
Встроенные функции в модулях, скомпилированных в собственном коде
В ограничениях таблиц, оптимизированных для памяти, и в модулях, скомпилированных в собственном коде 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.
-
Область применения: SQL Server 2017 (14.x).
Функции идентификации: SCOPE_IDENTITY.
NULL-функции: ISNULL
Функции уникальных идентификаторов: NEWID и NEWSEQUENTIALID
Функции JSON
-
Область применения: SQL Server 2017 (14.x).
Начиная с SQL Server 2017 (14.x), функции JSON поддерживаются в скомпилированных модулях в собственном коде.
-
Область применения: SQL Server 2017 (14.x).
Функции обработки ошибок: 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 ).
См. также
Скомпилированные в собственном коде хранимые процедуры
Проблемы миграции, связанные с хранимыми процедурами, скомпилированными в собственном коде