Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come creare una stored procedure associata a uno schema in SQL Server

Se hai mai creato un UDF legato allo schema, saprai che il binding dello schema è solo questione di aggiungere WITH SCHEMABINDING alla tua definizione Lo stesso vale quando crei una vista associata allo schema.

Le stored procedure sono leggermente diverse.

Solo le stored procedure compilate in modo nativo possono essere associate allo schema. In effetti, le stored procedure compilate in modo nativo devono essere legato allo schema. Non è possibile creare una stored procedure compilata in modo nativo senza associarla allo schema.

Ma se provi a associare allo schema una procedura normale (compilata in modo non nativo), riceverai un errore.

Esempio di procedura memorizzata legata a uno schema

Ecco un esempio di creazione di una stored procedure associata allo schema (compilata in modo nativo).

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

Ho incluso il WITH SCHEMABINDING argomento, ma ho incluso anche NATIVE_COMPILATION , che indica che la procedura è compilata in modo nativo.

Nota anche il ATOMIC WITH bloccare. Questo è necessario per le stored procedure compilate in modo nativo.

Questo codice ha creato una stored procedure legata allo schema.

Errore? Verifica questi prerequisiti

Le stored procedure compilate in modo nativo richiedono che tutte le tabelle sottostanti siano tabelle ottimizzate per la memoria.

Per creare tabelle con ottimizzazione per la memoria, devi prima creare un filegroup con ottimizzazione per la memoria.

Ecco il codice che ho usato per creare il filegroup ottimizzato per la memoria, il file associato e la tabella ottimizzata per la memoria a cui faccio riferimento nella stored procedure:

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

Quindi, se vuoi copiare e incollare il mio codice, dovrai prima eseguire questo, quindi il codice della procedura memorizzata sopra.

Si noti inoltre che sto usando SQL Server per Linux e quindi i percorsi dei file utilizzano le convenzioni di Linux. Se stai creando un file di database su Windows, dovrai modificarlo per utilizzare la convenzione del percorso file di Windows (e assicurati di utilizzare un percorso file esistente sul tuo sistema).