Поддерживаемые функции для модулей, скомпилированных в собственном коде 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.
Язык управления потоком
Поддерживаются следующие конструкции языка управления потоком:
DECLARE @local_variable (Transact-SQL) можно использовать все поддерживаемые типы данных для OLTP в памяти, а также оптимизированные для памяти типы таблиц. Переменные могут быть объявлены как NULL или NOT NULL;
ПОПЫТКА... CATCH (Transact-SQL)
- Чтобы достичь оптимальной производительности, используйте один блок 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).
FORCE ORDER
указание LOOP JOIN;
OPTIMIZE FOR
Дополнительные сведения см. в разделе Указания запросов (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 )
.
См. также
Скомпилированные в собственном коде хранимые процедуры
Проблемы миграции, связанные с хранимыми процедурами, скомпилированными в собственном коде