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.
Este tema contiene una lista de características admitidas para procedimientos almacenados compilados de forma nativa (CREATE PROCEDURE (Transact-SQL)):
Programación en procedimientos almacenados compilados de forma nativa
Funciones integradas en procedimientos almacenados compilados de forma nativa
Área de superficie de consulta en procedimientos almacenados compilados de forma nativa
Para obtener información sobre los tipos de datos admitidos en procedimientos almacenados compilados de forma nativa, consulte Tipos de datos admitidos.
Para obtener información completa sobre las construcciones no admitidas y para obtener información sobre cómo solucionar algunas de las características no admitidas en procedimientos almacenados compilados de forma nativa, vea Problemas de migración para procedimientos almacenados compilados de forma nativa. Para obtener más información sobre las funcionalidades no admitidas, consulte Transact-SQL construcciones no admitidas por In-Memory OLTP.
Programación en procedimientos almacenados compilados de forma nativa
Se admiten los siguientes:
BEGIN ATOMIC (en el nivel externo del procedimiento almacenado), LANGUAGE, ISOLATION LEVEL, DATEFORMAT y DATEFIRST.
Declarar variables como NULL o NOT NULL. Si una variable se declara como NOT NULL, la declaración debe tener un inicializador. Si una variable no se declara como NOT NULL, un inicializador es opcional.
IF y WHILE
INSERTAR/ACTUALIZAR/ELIMINAR
No se admiten subconsultas. En la cláusula WHERE o HAVING se admiten AND y BETWEEN; sin embargo, no se admiten OR, NOT y IN.
Tipos de tabla optimizados para memoria y variables de tabla.
RETORNO
Seleccionar
ESTABLECER
INTENTAR/APREHENDER/LANZAR
Para optimizar el rendimiento, use un único bloque TRY/CATCH para un procedimiento almacenado compilado completamente de forma nativa.
Operadores soportados
Se admiten los operadores siguientes.
Los operadores de comparación (Transact-SQL) (por ejemplo, >, , <>= y <=) se admiten en condicionales (IF, WHILE).
Operadores unarios (+, -).
Operadores binarios (*, /, +, -, % (módulo)).
El operador más (+) se soporta tanto en números como en cadenas.
Operadores lógicos (AND, OR, NOT). OR y NOT se permiten en instrucciones IF y WHILE, pero no en las cláusulas WHERE y HAVING.
Operadores bitwise ~, &, |, y ^
Funciones integradas en procedimientos almacenados compilados de forma nativa
Las siguientes funciones se admiten en restricciones predeterminadas en tablas optimizadas para memoria y en procedimientos almacenados compilados de forma nativa.
Funciones matemáticas: ACOS, ASIN, ATAN, ATN2, COS, COT, DEGREES, EXP, LOG, LOG10, PI, POWER, RADIANS, RAND, SIN, SQRT, SQUARE y TAN
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
Función de identidad: SCOPE_IDENTITY
Funciones NULL: ISNULL
Funciones Uniqueidentifier: NEWID y NEWSEQUENTIALID
Funciones de error: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY y ERROR_STATE
Conversiones: CAST y CONVERT. No se admiten conversiones entre cadenas de caracteres Unicode y no Unicode (n(var)char y (var)char.
Funciones del sistema: @@rowcount. Las instrucciones dentro de 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 a 0 al principio y al final de la ejecución de un procedimiento almacenado compilado de forma nativa.
Superficie de Consulta en Procedimientos Almacenados Compilados de Forma Nativa
Se admiten los siguientes:
ENTRE
Aliases de nombres de columnas (mediante la sintaxis de AS o =)
CROSS JOIN e INNER JOIN solo se permiten con consultas SELECT.
Las expresiones se admiten en la cláusula SELECT list y WHERE (Transact-SQL) si usan un operador compatible. Consulte Operadores admitidos para obtener la lista de operadores admitidos actualmente.
Predicado de filtro IS [NOT] NULL
FROM <tabla optimizada para memoria>
GROUP BY (Transact-SQL) se admite, junto con las funciones de agregado AVG, COUNT, COUNT_BIG, MIN, MAX y SUM. MIN y MAX no se admiten para los tipos nvarchar, char, varchar, varchar, varbinary y binary. La cláusula ORDER BY (Transact-SQL) se admite con GROUP BY (Transact-SQL) si una expresión de la lista ORDER BY aparece textualmente en la lista GROUP BY. Por ejemplo, GROUP BY a + b ORDER BY a + b es compatible, pero GROUP BY a, b ORDER BY a + b no lo es.
HAVING, sujeto a las mismas limitaciones de expresión que la cláusula WHERE.
INSERT VALUES (una fila por instrucción) e INSERT SELECT
ORDER BY 1
Los predicados no hacen referencia a una columna.
SELECT, UPDATE y DELETE
TOP 1
Asignación de variables en la lista SELECT.
DÓNDE... Y
1 ORDER BY y TOP se admiten en procedimientos almacenados compilados de forma nativa, con algunas restricciones:
No hay compatibilidad con
DISTINCTen la cláusulaSELECToORDER BY.No hay compatibilidad con
WITH TIESoPERCENTen laTOPcláusula .TOPcombinado conORDER BYno admite más de 8.192 cuando se usa una constante en laTOPcláusula . Este límite se puede reducir 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 4096 filas. Con dos combinaciones (tres tablas), el límite es de 2730 filas).Puede obtener resultados mayores que 8192 almacenando el número de filas en una variable:
DECLARE @v INT = 9000 SELECT TOP (@v) ... FROM ... ORDER BY ...
Sin embargo, una constante de la TOP cláusula da como resultado un mejor rendimiento en comparación con el uso de una variable.
Estas restricciones no se aplican al acceso interpretado Transact-SQL en tablas optimizadas para el uso de memoria.
Auditoría
La auditoría a nivel de procedimiento se admite en procedimientos almacenados compilados nativamente. No se admite la auditoría de nivel de instrucción.
Para obtener más información sobre la auditoría, vea Crear una auditoría de servidor y una especificación de auditoría de base de datos.
Sugerencias de tabla, consulta y combinación
Se admiten los siguientes:
Indicaciones INDEX, FORCESCAN y FORCESEEK, ya sea en la sintaxis de indicaciones de tabla o en la cláusula OPTION (Transact-SQL) de la consulta.
IMPOSICIÓN DE ORDEN
INNER LOOP JOIN
OPTIMIZAR PARA
Para obtener más información, consulta Sugerencias (Transact-SQL).
Limitaciones de la 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). Sin embargo, sin la cláusula ORDER BY (Transact-SQL), TOP (Transact-SQL) puede ordenar hasta 8000 filas (menos filas si hay combinaciones).
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, recibe el mensaje de error: Msg 41398, Nivel 16, Estado 1, Procedimiento <procedureName>, Línea <lineNumber> El operador TOP puede devolver un máximo de 8192 filas; se solicitaron <number>.
Si no tiene una cláusula TOP, puede ordenar cualquier número de filas con ORDER BY.
Si no usa una cláusula ORDER BY, puede usar cualquier 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: no se puede 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 fila 8192 solo se aplica a TOP N donde N es una constante, como en los ejemplos anteriores. Si necesita N más de 8192, puede asignar el valor a una variable y usar esa variable con TOP.
Ejemplo de uso de 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 de las filas devueltas: Hay dos casos en los que puede reducir potencialmente el número de filas que puede devolver el operador TOP:
Uso de JOIN en la consulta. La influencia de los JOIN en la limitación depende del plan de consulta.
Uso de funciones de agregado o referencias a funciones de agregado en la cláusula ORDER BY.
La fórmula para calcular el máximo N admitido en el peor caso en TOP N es: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).
Véase también
Procedimientos almacenados compilados de forma nativa
Problemas de migración para los procedimientos almacenados compilados de forma nativa