Características admitidas en los módulos T-SQL compilados de forma nativa

Se aplica a:SQL ServerAzure SQL DatabaseAzure 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.

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.

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.
  • 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.
  • 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:

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