Características admitidas en los módulos T-SQL compilados de forma nativa
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
En este tema se incluye una lista de áreas expuestas y características admitidas de T-SQL en el cuerpo de los módulos T-SQL compilados de forma nativa, como procedimientos almacenados (CREATE PROCEDURE (Transact-SQL)), funciones escalares definidas por el usuario, funciones con valores de tabla insertadas y desencadenadores.
Si quiere conocer las características admitidas en torno a la definición de los módulos nativos, vea Construcciones DDL admitidas para módulos T-SQL compilados de forma nativa.
Para tener información completa sobre las construcciones no admitidas y sobre cómo evitar algunas de las características no admitidas en los módulos compilados de forma nativa, consulte Migration Issues for Natively Compiled Stored Procedures. Para obtener más información sobre las características no compatibles, vea Construcciones Transact-SQL no admitidas por OLTP en memoria.
Área expuesta de consulta en los módulos nativos
Se admiten las siguientes construcciones de consulta:
Expresión CASE: se puede usar CASE en cualquier instrucción o cláusula que permita una expresión válida.
- Se aplica a: SQL Server 2017 (14.x).
A partir de SQL Server 2017 (14.x) se admiten las instrucciones CASE para módulos T-SQL compilados de forma nativa.
Cláusula SELECT:
Alias de columnas y nombre (con sintaxis AS o =).
Subconsultas escalares
- Se aplica a: SQL Server 2016 (13.x). A partir de SQL Server 2016 (13.x) se admiten las subconsultas escalares en módulos compilados de forma nativa.
TOP*
SELECT DISTINCT
Se aplica a: SQL Server 2016 (13.x). A partir de SQL Server 2016 (13.x), el operador DISTINCT se admite en módulos compilados de forma nativa.
- No se admiten agregados DISTINCT.
UNION y UNION ALL
- Se aplica a: SQL Server 2016 (13.x). A partir de SQL Server 2016 (13.x), los operadores UNION y UNION ALL se admiten en módulos compilados de forma nativa.
Asignaciones de variables
Cláusula FROM:
FROM <tabla con optimización para memoria o variable de tabla>
FROM <TVF insertada compilada de forma nativa>
LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN y INNER JOIN.
- Se aplica a: SQL Server 2016 (13.x). A partir de SQL Server 2016 (13.x) se admiten las operaciones JOIN en módulos compilados de forma nativa.
Subconsultas
[AS] table_alias
. Para obtener más información, consulte FROM (Transact-SQL).- Se aplica a: SQL Server 2016 (13.x). A partir de SQL Server 2016 (13.x) se admiten las subconsultas en módulos compilados de forma nativa.
Cláusula WHERE:
Predicado de filtro IS [NOT] NULL
AND, BETWEEN
OR, NOT, IN, EXISTS
- Se aplica a: SQL Server 2016 (13.x). A partir de SQL Server 2016 (13.x) se admiten los operadores ON, NOT, IN y EXISTS en módulos compilados de forma nativa.
CláusulaGROUP BY :
Funciones de agregado AVG, COUNT, COUNT_BIG, MIN, MAX y SUM.
MIN o MAX no se admiten para los tipos nvarchar, char, varchar, varchar, varbinary y binary.
CláusulaORDER BY :
No hay compatibilidad con DISTINCT en la cláusula ORDER BY .
Se admite con GROUP BY (Transact-SQL) si una expresión de la lista ORDER BY aparece literalmente en la lista GROUP BY.
- Por ejemplo, se admite GROUP BY a + b ORDER BY a + b pero no GROUP BY a, b ORDER BY a + b.
Cláusula HAVING:
- Está sujeta a las mismas limitaciones de expresión que la cláusula WHERE.
Se admiten ORDER BY y TOP en módulos compilados de forma nativa, con algunas restricciones.
No hay compatibilidad con WITH TIES ni PERCENT en la cláusula TOP .
No hay compatibilidad con DISTINCT en la cláusula ORDER BY .
TOP combinada con ORDER BY no admite más de 8.192 elementos cuando se utiliza una constante en la cláusula TOP .
- Este límite puede reducirse en caso de que la consulta contenga combinaciones o funciones de agregado. (Por ejemplo, con una combinación (dos tablas), el límite es de 4.096 filas. Con dos combinaciones (tres tablas), el límite es de 2.730 filas).
- Puede obtener más de 8.192 resultados si almacena el número de filas en una variable:
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...
Sin embargo, una constante en la cláusula TOP produce un rendimiento mejor en comparación con el uso de una variable.
Estas restricciones en Transact-SQL compilado de forma nativa no se aplican al acceso mediante Transact-SQL interpretado a las tablas optimizadas para memoria.
Modificación de datos
Se admiten las siguientes instrucciones DML.
INSERT VALUES (una fila por instrucción) e INSERT SELECT... SELECT
UPDATE
Delete
Se admite WHERE con instrucciones UPDATE y DELETE.
Idioma de control de flujo
Se admiten las siguientes construcciones de lenguaje de control de flujo.
DECLARE @local_variable (Transact-SQL) puede usar todos los tipos de datos admitidos para OLTP en memoria, así como los tipos de tablas optimizadas para memoria. Las variables se pueden declarar como NULL o NOT NULL.
-
- Para optimizar el rendimiento, use un solo bloque TRY/CATCH para un módulo T-SQL compilado completamente de forma nativa.
BEGIN ATOMIC (en el nivel externo del procedimiento almacenado). Para más información, consulte Atomic Blocks.
Operadores compatibles
Se admiten los siguientes operadores.
Operadores de comparación (Transact-SQL) (por ejemplo, >, <, >=, and <=)
Operadores unarios (+, -).
Operadores binarios ((*, /, +, -, % (módulo)).
- Se admite el operador más (+) en ambos números y cadenas.
Operadores lógicos (AND, OR, NOT).
Operadores ~, &, | y ^ bit a bit
APPLY, operador
- Se aplica a: SQL Server 2017 (14.x).
A partir de SQL Server 2017 (14.x), el operador APPLY se admite en los módulos compilados de forma nativa.
- Se aplica a: SQL Server 2017 (14.x).
Funciones integradas en módulos compilados de forma nativa
Las funciones siguientes se admiten en restricciones de tablas optimizadas para memoria y en módulos T-SQL compilados de forma nativa.
Todas las funciones matemáticas (Transact-SQL)
Funciones de fecha: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME y YEAR.
Funciones de cadena: LEN, LTRIM, RTRIM y SUBSTRING.
- Se aplica a: SQL Server 2017 (14.x).
A partir de SQL Server 2017 (14.x), también se admiten las siguientes funciones integradas: TRIM, TRANSLATE y CONCAT_WS.
- Se aplica a: SQL Server 2017 (14.x).
Funciones de identidad: SCOPE_IDENTITY
Funciones NULL: ISNULL
Funciones uniqueidentifier: NEWID y NEWSEQUENTIALID
Funciones JSON
- Se aplica a: SQL Server 2017 (14.x).
A partir de SQL Server 2017 (14.x), las funciones JSON se admiten en los módulos compilados de forma nativa.
- Se aplica a: SQL Server 2017 (14.x).
Funciones de error: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY y ERROR_STATE
Funciones del sistema: @@rowcount. Las instrucciones de los procedimientos almacenados compilados de forma nativa actualizan @@rowcount y puede usar @@rowcount en un procedimiento almacenado compilado de forma nativa para determinar el número de filas afectadas por la última instrucción ejecutada dentro de ese procedimiento almacenado compilado de forma nativa. Sin embargo, @@rowcount se restablece en 0 al principio y al final de la ejecución de un procedimiento almacenado compilado de forma nativa.
Funciones de seguridad: 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().
Se pueden anidar las ejecuciones de módulos nativos.
Auditoría
Se admite la auditoría a nivel de procedimiento en los procedimientos almacenados compilados de forma nativa.
Para obtener más información sobre la auditoría, vea Crear una especificación de auditoría de servidor y de auditoría de base de datos
Sugerencias de consulta y tabla
Se admite lo siguiente:
Las sugerencias INDEX, FORCESCAN y FORCESEEK, ya sea en la sintaxis de sugerencias de tabla o en la cláusula OPTION (Transact-SQL) de la consulta. Para obtener más información, vea Sugerencias de tabla (Transact-SQL).
FORCE ORDER
Sugerencia LOOP JOIN
OPTIMIZE FOR
Para obtener más información, consulte Sugerencias de consulta (Transact-SQL).
Limitaciones de ordenación
Puede ordenar más de 8000 filas en una consulta que use TOP (Transact-SQL) y una cláusula ORDER BY (Transact-SQL). Pero sin la cláusula ORDER BY (Transact-SQL), TOP (Transact-SQL) puede ordenar hasta 8000 filas (si hay combinaciones, menos filas).
Si la consulta usa el operador TOP (Transact-SQL) y una cláusula ORDER BY (Transact-SQL), puede especificar hasta 8192 filas para el operador TOP. Si especifica más de 8192 filas obtendrá el mensaje de error: Mensaje 41398, nivel 16, estado 1, procedimiento <nombredeprocedimiento>, línea <númerodelínea> El operador TOP puede devolver un máximo de 8192 filas; el número solicitado es <número>.
Si no tiene una cláusula TOP, puede ordenar cualquier número de filas con ORDER BY.
Si no utiliza una cláusula ORDER BY, puede utilizar un valor entero con el operador TOP.
Ejemplo con TOP n = 8192: se compila
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
Ejemplo con TOP N > 8192: error al compilar.
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
La limitación de 8192 filas solo se aplica a TOP N
donde N
es una constante, como en los ejemplos anteriores. Si necesita un número N
mayor que 8192 puede asignar el valor a una variable y utilizar esa variable con TOP
.
Ejemplo usando una variable: se compila
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
Limitaciones para las filas devueltas: hay dos casos en los que se puede reducir el número de filas que puede devolver el operador TOP:
Usar JOIN en la consulta. El efecto de JOIN en la limitación depende del plan de consulta.
Usar funciones de agregado o referencias a funciones de agregado en la cláusula ORDER BY.
La fórmula para calcular un N máximo de peor caso admitido en TOP N es: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )
.
Consulte también
Procedimientos almacenados compilados de forma nativa
Problemas de migración para los procedimientos almacenados compilados de forma nativa