Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Este tema contiene una lista de áreas expuestas de T-SQL y características admitidas en el cuerpo de módulos T-SQL compilados de forma nativa, como procedimientos almacenados ( (CREATE PROCEDURETransact-SQL)), funciones escalares definidas por el usuario, funciones insertadas con valores de tabla y desencadenadores.
Para conocer las características compatibles relacionadas con la definición de los módulos compilados de forma nativa, consulte DDL admitido 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.
Superficie 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 de nombres (con la 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 <una tabla optimizada para memoria o una variable de tabla>
FROM <TVF en línea compilada nativamente>
UNIÓN EXTERNA IZQUIERDA, UNIÓN EXTERNA DERECHA, UNIÓN CRUZADA y UNIÓN INTERNA.
- 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 ES [NO] NULO
Y, ENTRE
O BIEN, NO, EN, EXISTE
- 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 sentencia) y INSERT ... SELECT
UPDATE
DELETE
WHERE es compatible con las 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 más 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)).
- El operador de suma (+) se admite tanto en números como en cadenas.
Operadores lógicos (AND, OR, NOT).
Operadores a nivel de bit ~, &, | y ^
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 de 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 tabla y de consulta
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).
ORDEN DE FUERZAS
Sugerencia LOOP JOIN
OPTIMIZAR PARA
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: 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 con una variable: 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:
Uso de JOINs en la consulta. La influencia de las combinaciones JOIN en la limitación depende del plan de consulta.
Usar funciones de agregación o referencias a funciones de agregación 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