sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man skapar en schemabunden lagrad procedur i SQL Server

Om du någonsin har skapat en schemabunden UDF vet du att schemabindning det bara är en fråga om att lägga till WITH SCHEMABINDING till din definition. Detsamma gäller när du skapar en schemabunden vy.

Lagrade procedurer är lite annorlunda.

Endast inbyggt kompilerade lagrade procedurer kan schemabundna. Faktum är att inbyggt kompilerade lagrade procedurer måste vara schemabunden. Du kan inte skapa en inbyggt kompilerad lagrad procedur utan att schemat binder den.

Men om du försöker schemalägga en vanlig (icke-inbyggt kompilerad) procedur får du ett felmeddelande.

Exempel på en Schemabunden lagrad procedur

Här är ett exempel på hur du skapar en schemabunden (naturligt kompilerad) lagrad procedur.

SKAPA PROCEDUR dbo.usp_GetCowsByName @cowname varchar(70)WITH SCHEMABINDING, NATIVE_COMPILATIONASBEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL =SNAPSHOT, LANGUAGE =N'us_english' ) CoROMFEL CowNamn, CowHEREI; /pre> 

Jag har inkluderat WITH SCHEMABINDING argument, men jag har även inkluderat NATIVE_COMPILATION , vilket indikerar att proceduren är inbyggd kompilerad.

Lägg också märke till ATOMIC WITH blockera. Detta krävs för inbyggt kompilerade lagrade procedurer.

Denna kod skapade en schemabunden lagrad procedur.

Fel? Kontrollera dessa förutsättningar

Inbyggt kompilerade lagrade procedurer kräver att alla underliggande tabeller är minnesoptimerade tabeller.

För att skapa minnesoptimerade tabeller måste du först skapa en minnesoptimerad filgrupp.

Här är koden jag använde för att skapa den minnesoptimerade filgruppen, dess tillhörande fil och den minnesoptimerade tabellen som jag refererar till i den lagrade proceduren:

ÄNDRA DATABAS Test LÄGG TILL FILGROUP imoltp_test INNEHÅLLER MEMORY_OPTIMIZED_DATA;GOALTER DATABASE Test LÄGG TILL FIL (name='imoltp_test1', filename='/var/opt/mssql/data/imoltp_test1.mdf_test') TILL dFICREABLEGROUP] .[Cows]( [CowId] [int] IDENTITET(1,1) INTE NULL PRIMÄRNYCKEL ICKELUSTERAD, [CowName] [varchar](70) NULL, [Phone] [varchar](10) NULL) MED (MEMORY_OPTIMIZED =PÅ , DURABILITY =SCHEMA_AND_DATA)GO

Så om du vill kopiera och klistra in min kod måste du köra den här först, sedan den lagrade procedurkoden ovan.

Observera också att jag använder SQL Server för Linux, så att filvägarna använder Linux-konventioner. Om du skapar en databasfil på Windows måste du ändra den för att använda Windows-filsökvägskonventionen (och se till att använda en filsökväg som finns på ditt system).


  1. Lista över territorier som stöds av Oracle Database

  2. Oracle:Hur konverterar jag hex till decimal i Oracle SQL?

  3. Använda varchar(MAX) vs TEXT på SQL Server

  4. Hur avrundar man till närmaste X minuter med PL/pgSQL?