sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo crear un procedimiento almacenado vinculado a un esquema en SQL Server

Si alguna vez ha creado una UDF vinculada a un esquema, sabrá que la vinculación de un esquema es solo una cuestión de agregar WITH SCHEMABINDING a su definición. Lo mismo se aplica cuando crea una vista enlazada al esquema.

Los procedimientos almacenados son un poco diferentes.

Solo los procedimientos almacenados compilados de forma nativa pueden vincularse a un esquema. De hecho, los procedimientos almacenados compilados de forma nativa deben estar vinculado al esquema. No puede crear un procedimiento almacenado compilado de forma nativa sin vincularlo con un esquema.

Pero si intenta vincular un esquema a un procedimiento normal (no compilado de forma nativa), obtendrá un error.

Ejemplo de un procedimiento almacenado vinculado al esquema

Este es un ejemplo de cómo crear un procedimiento almacenado vinculado a un esquema (compilado de forma nativa).

CREATE PROCEDURE dbo.usp_GetCowsByName @cowname varchar(70)
WITH SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (
    TRANSACTION ISOLATION LEVEL = SNAPSHOT, 
    LANGUAGE = N'us_english'
    )  
SELECT 
    CowId,
    CowName,
    Phone
FROM dbo.Cows
WHERE CowName = @cowname
END;

GO

He incluido el WITH SCHEMABINDING argumento, pero también he incluido NATIVE_COMPILATION , lo que indica que el procedimiento se compila de forma nativa.

Observe también el ATOMIC WITH cuadra. Esto es necesario para los procedimientos almacenados compilados de forma nativa.

Este código creó un procedimiento almacenado vinculado al esquema.

¿Error? Verifique estos requisitos previos

Los procedimientos almacenados compilados de forma nativa requieren que las tablas subyacentes sean tablas optimizadas para memoria.

Para crear tablas optimizadas para memoria, primero debe crear un grupo de archivos optimizado para memoria.

Este es el código que usé para crear el grupo de archivos optimizado para memoria, su archivo asociado y la tabla optimizada para memoria a la que hago referencia en el procedimiento almacenado:

ALTER DATABASE Test
    ADD FILEGROUP imoltp_test CONTAINS MEMORY_OPTIMIZED_DATA;
GO

ALTER DATABASE Test 
    ADD FILE (name='imoltp_test1', filename='/var/opt/mssql/data/imoltp_test1.mdf')
    TO FILEGROUP imoltp_test;
GO

CREATE TABLE [dbo].[Cows](
	[CowId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY NONCLUSTERED,
	[CowName] [varchar](70) NULL,
	[Phone] [varchar](10) NULL
) 
    WITH
        (MEMORY_OPTIMIZED = ON,
        DURABILITY = SCHEMA_AND_DATA)
GO

Entonces, si desea copiar y pegar mi código, primero deberá ejecutar esto, luego el código de procedimiento almacenado anterior.

También tenga en cuenta que estoy usando SQL Server para Linux, por lo que las rutas de los archivos usan las convenciones de Linux. Si está creando un archivo de base de datos en Windows, deberá cambiarlo para usar la convención de ruta de archivo de Windows (y asegúrese de usar una ruta de archivo que exista en su sistema).