Crear procedimientos almacenados compilados de forma nativa

Los procedimientos almacenados compilados de forma nativa no implementan el área expuesta de consulta y programación de Transact-SQL completa. 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 atomic. Para obtener más información, consulte Atomic Blocks.

  • Restricciones NOT NULL en los parámetros y variables de los procedimientos almacenados compilados de forma nativa. No se pueden asignar valores NULL a los parámetros o variables declarados como NOT NULL. Para obtener más información, vea DECLARE @local_variable (Transact-SQL).

  • Enlace de esquema de los 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 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 procedimiento almacenado de Transact-SQL 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 se debe enlazar al esquema de objetos al que hacen referencia. Esto significa que no se puede anular la tabla a la que hace referencia el procedimiento. Las tablas a las que se hace referencia en el procedimiento deben incluir el nombre de esquema y no se admite caracteres comodín (*) en las consultas. SCHEMABINDINGsolo 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 tanto, se deberá especificar el contexto de ejecución. Se admiten las opciones EXECUTE AS OWNER, EXECUTE ASel usuario y EXECUTE AS SELF .
BEGIN ATOMIC El cuerpo de un procedimiento almacenado compilado de forma nativa debe constar exactamente de un solo bloque atomic. Los bloques atomic garantizan la ejecución atómica del procedimiento almacenado. Si se invoca el procedimiento fuera del contexto de una transacción activa, iniciará una nueva transacción, que se confirma al final del bloque atomic. Los bloques atomic de los procedimientos almacenados compilados de forma nativa tienen dos opciones obligatorias:

TRANSACTION ISOLATION LEVEL. Consulte Niveles de aislamiento de transacción para conocer los niveles de aislamiento admitidos.

LANGUAGE. El lenguaje del procedimiento almacenado se debe establecer en uno de los lenguajes o de alias de lenguaje disponibles.

En relación con EXECUTE AS y los inicios de sesión de Windows, puede aparecer un error debido a la suplantación realizada con EXECUTE AS. Si una cuenta de usuario usa la autenticación de Windows, debe haber plena confianza entre la cuenta de servicio usada 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 de SQL Server.

  • Si SQL Server usa una cuenta de equipo como servicio de red o sistema local, el dominio que contiene el usuario de Windows debe confiar en la máquina.

  • Use la autenticación 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.

Actualizar un procedimiento almacenado compilado de forma nativa

No se permite la realización de operaciones de modificación 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:

  1. Genere el script para los permisos en el procedimiento almacenado.

  2. También puede generar el script para el procedimiento almacenado y guardarlo como copia de seguridad.

  3. Quite el procedimiento almacenado.

  4. Cree el procedimiento almacenado con las modificaciones.

  5. Vuelva a aplicar los permisos del script al procedimiento almacenado.

El inconveniente 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 es posible que el cliente que utiliza la aplicación vea mensajes de error.

Otra manera de modificar (eficazmente) un procedimiento almacenado compilado de forma nativa consiste en crear 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.

  1. Genere el script para los permisos en SP_Vold.

  2. Cree SP_Vnew.

  3. Aplique los permisos de SP_Vold a SP_Vnew.

  4. Actualice las referencias a SP_Vold para que señalen a SP_Vnew. Esto puede llevarse a cabo de diferentes formas, por ejemplo:

    Utilice un procedimiento almacenado de contenedor (basado en disco), y modifíquelo para que señale a SP_Vnew. El inconveniente de este método es el impacto sobre el rendimiento del direccionamiento indirecto.

    ALTER PROCEDURE dbo.SP p1,...,pn  
    AS  
      EXEC dbo.SP_Vnew p1,...,pn  
    GO  
    
  5. Si lo desea, quite SP_Vold.

La ventaja de este método es que la aplicación no se queda sin conexión. Sin embargo, es necesario más trabajo para mantener las referencias y asegurarse de que siempre señalan a la última versión del procedimiento almacenado.

Consulte también

Procedimientos almacenados compilados de forma nativa