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.
Los procedimientos almacenados compilados de forma nativa no implementan la plena capacidad de programación Transact-SQL y la superficie de consulta. Hay ciertas construcciones de Transact-SQL que no se pueden usar dentro de procedimientos almacenados compilados de forma nativa. Para obtener más información, vea Construcciones admitidas en procedimientos almacenados compilados de forma nativa.
Sin embargo, hay varias características de Transact-SQL que solo se admiten para procedimientos almacenados compilados de forma nativa:
Bloques atómicos. Para obtener más información, vea Bloques atómicos.
NOT NULLrestricciones en parámetros y variables en procedimientos almacenados compilados de forma nativa. No se pueden asignarNULLvalores a parámetros o variables declarados comoNOT NULL. Para obtener más información, consulte DECLARE @local_variable (Transact-SQL).Enlace de esquema de procedimientos almacenados compilados de forma nativa.
Los procedimientos almacenados compilados de forma nativa se crean mediante CREATE PROCEDURE (Transact-SQL). En el ejemplo siguiente se muestra una tabla optimizada para memoria y un procedimiento almacenado compilado de forma nativa que se usa para insertar filas en la tabla.
create table dbo.Ord
(OrdNo integer not null primary key nonclustered,
OrdDate datetime not null,
CustCode nvarchar(5) not null)
with (memory_optimized=on)
go
create procedure dbo.OrderInsert(@OrdNo integer, @CustCode nvarchar(5))
with native_compilation, schemabinding, execute as owner
as
begin atomic with
(transaction isolation level = snapshot,
language = N'English')
declare @OrdDate datetime = getdate();
insert into dbo.Ord (OrdNo, CustCode, OrdDate) values (@OrdNo, @CustCode, @OrdDate);
end
go
En el ejemplo de código, NATIVE_COMPILATION indica que este Transact-SQL procedimiento almacenado es un procedimiento almacenado compilado de forma nativa. Se requieren las siguientes opciones:
| Opción | Descripción |
|---|---|
SCHEMABINDING |
Los procedimientos almacenados compilados de forma nativa deben enlazarse al esquema de los objetos a los que hace referencia. Esto significa que las referencias de tabla no se pueden eliminar debido al procedimiento. Las tablas a las que se hace referencia en el procedimiento deben incluir su nombre de esquema y los caracteres comodín (*) no se permiten en las consultas.
SCHEMABINDING solo se admite para procedimientos almacenados compilados de forma nativa en esta versión de SQL Server. |
EXECUTE AS |
Los procedimientos almacenados compilados de forma nativa no admiten EXECUTE AS CALLER, que es el contexto de ejecución predeterminado. Por lo tanto, es necesario especificar el contexto de ejecución. Se admiten las opciones EXECUTE AS OWNER, EXECUTE ASel usuario y EXECUTE AS SELF . |
BEGIN ATOMIC |
El cuerpo del procedimiento almacenado compilado de forma nativa debe constar de exactamente un bloque atómico. Los bloques atómicos garantizan la ejecución atómica del procedimiento almacenado. Si el procedimiento se invoca fuera del contexto de una transacción activa, iniciará una nueva transacción, la cual se confirmará al finalizar el bloque atómico. Los bloques atómicos en procedimientos almacenados compilados de forma nativa tienen dos opciones necesarias:TRANSACTION ISOLATION LEVEL. Consulte Niveles de aislamiento de transacciones para conocer los niveles de aislamiento admitidos.LANGUAGE. El idioma del procedimiento almacenado debe establecerse en uno de los idiomas o alias de idioma disponibles. |
Con respecto a EXECUTE AS y los inicios de sesión de Windows, se puede producir un error debido a la suplantación realizada a través de EXECUTE AS. Si una cuenta de usuario usa la autenticación de Windows, debe haber plena confianza entre la cuenta de servicio utilizada para la instancia de SQL Server y el dominio del inicio de sesión de Windows. Si no hay plena confianza, se devuelve el siguiente mensaje de error al crear un procedimiento almacenado compilado de forma nativa: Msg 15404, No se pudo obtener información sobre el grupo o usuario de Windows NT "username", el código de error 0x5.
Para resolver este error, use una de las siguientes opciones:
Use una cuenta del mismo dominio que el usuario de Windows para el servicio SQL Server.
Si SQL Server usa una cuenta de equipo como Network Service o Local System, la máquina debe ser confiable en el dominio que contiene el usuario de Windows.
Use la autenticación de SQL Server.
También puede ver el error 15517 al crear un procedimiento almacenado compilado de forma nativa. Para obtener más información, consulte MSSQLSERVER_15517.
Actualización de un procedimiento almacenado compilado de forma nativa
No se admite la realización de operaciones alter en procedimientos almacenados compilados de forma nativa. Una manera de modificar un procedimiento almacenado compilado de forma nativa es quitar y volver a crear el procedimiento almacenado:
Generar el script para gestionar los permisos del procedimiento almacenado.
Opcional, genere script para el procedimiento almacenado y guárdelo como copia de seguridad.
Elimine el procedimiento almacenado.
Cree el procedimiento almacenado modificado.
Vuelva a aplicar los permisos con script al procedimiento almacenado.
La desventaja de este procedimiento es que la aplicación estará sin conexión desde el inicio del paso 3 hasta la finalización del paso 5. Esto puede tardar unos segundos y el cliente que usa la aplicación puede ver mensajes de error.
Otra manera (eficaz) de modificar un procedimiento almacenado compilado de forma nativa es crear primero una nueva versión del procedimiento almacenado. Aquí, el procedimiento almacenado compilado de forma nativa tiene un número de versión asociado. Llamaremos a la versión anterior SP_Vold y a la nueva versión SP_Vnew.
Generar script para los permisos en SP_Vold.
Cree SP_Vnew.
Aplique los permisos de SP_Vold a SP_Vnew.
Actualice las referencias a SP_Vold para que apunten a SP_Vnew. Esto se puede lograr de diferentes maneras, por ejemplo:
Use un procedimiento almacenado envolvente (basado en disco) y ajuste ese procedimiento para que apunte a SP_Vnew. La desventaja de este enfoque es el impacto en el rendimiento de la indirección.
ALTER PROCEDURE dbo.SP p1,...,pn AS EXEC dbo.SP_Vnew p1,...,pn GOOpcional, eliminar SP_Vold.
La ventaja de este enfoque es que la aplicación no se queda sin conexión. Sin embargo, se requiere más trabajo para mantener las referencias y asegurarse de que siempre apuntan a la versión más reciente del procedimiento almacenado.