Skapa internt kompilerade lagrade procedurer

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Inbyggt kompilerade lagrade procedurer implementerar inte hela den fullständiga Transact-SQL-programmerbarhets- och frågeytan. Det finns vissa Transact-SQL konstruktioner som inte kan användas i internt kompilerade lagrade procedurer. Mer information finns i Funktioner som stöds för internt kompilerade T-SQL-moduler.

Följande Transact-SQL funktioner stöds endast för internt kompilerade lagrade procedurer:

  • Atomiska block. Mer information finns i Atomblock.

  • NOT NULL begränsningar för parametrar och variabler. Du kan inte tilldela NULL-värden till parametrar eller variabler som deklarerats som NOT NULL. Mer information finns i DECLARE @local_variable (Transact-SQL).

    • CREATE PROCEDURE dbo.myproc (@myVarchar VARCHAR(32) NOT NULL) AS (...)

    • DECLARE @myVarchar VARCHAR(32) NOT NULL = "Hello"; -- Must initialize to a value.

    • SET @myVarchar = NULL; -- Compiles, but fails during run time.

  • Schemabindning av internt kompilerade lagrade procedurer.

Internt kompilerade lagrade procedurer skapas med CREATE PROCEDURE (Transact-SQL). I följande exempel visas en minnesoptimerad tabell och en internt kompilerad lagrad procedur som används för att infoga rader i tabellen.

CREATE TABLE [dbo].[T2] (  
  [c1] [int] NOT NULL, 
  [c2] [datetime] NOT NULL,
  [c3] nvarchar(5) NOT NULL, 
  CONSTRAINT [PK_T1] PRIMARY KEY NONCLUSTERED ([c1])  
  ) WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA )  
GO  
  
CREATE PROCEDURE [dbo].[usp_2] (@c1 int, @c3 nvarchar(5)) 
WITH NATIVE_COMPILATION, SCHEMABINDING  
AS BEGIN ATOMIC WITH  
(  
 TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english'  
)  
  DECLARE @c2 datetime = GETDATE();  
  INSERT INTO [dbo].[T2] (c1, c2, c3) values (@c1, @c2, @c3);  
END  
GO  

I kodexemplet anger NATIVE_COMPILATION att den här Transact-SQL lagrade proceduren är en internt kompilerad lagrad procedur. Följande alternativ krävs:

Option Description
SCHEMABINDNING En internt kompilerad lagrad procedur måste vara bunden till schemat för de objekt som den refererar till. Det innebär att tabeller som refereras till av proceduren inte kan tas bort. Tabeller som refereras i proceduren måste innehålla deras schemanamn och jokertecken (*) tillåts inte i frågor (vilket betyder nej SELECT * from...). SCHEMABINDING stöds endast för internt kompilerade lagrade procedurer i den här versionen av SQL Server.
PÅBÖRJA ATOMISK Den inbyggda lagrade procedurtexten måste bestå av exakt ett atomiskt block. Atomiska block garanterar att den lagrade proceduren körs atomiskt. Om proceduren anropas utanför en aktiv transaktionskontext startar den en ny transaktion som godkänns i slutet av atomblocket. Atomiska block i inbyggda kompilerade lagrade procedurer har två obligatoriska alternativ:

TRANSAKTIONSISOLERINGSNIVÅ. Se Transaktionsisoleringsnivåer för Memory-Optimized-tabeller för isoleringsnivåer som stöds.

SPRÅK. Språket för den lagrade proceduren måste anges till något av de tillgängliga språken eller språkaliasen.

Se även

Internt kompilerade lagrade procedurer