建立原生編譯的預存程序

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體

原生編譯預存程序不會實作完整 Transact-SQL 可程式性和查詢介面區。 某些 Transact-SQL 建構無法在原生編譯的預存程序內使用。 如需詳細資訊,請參閱 原生編譯的 T-SQL 模組支援的功能。

只有原生編譯預存程序支援下列 Transact-SQL 功能:

  • 原子區塊。 如需詳細資訊,請參閱 Atomic Blocks。

  • 參數和變數上的 NOT NULL 限制式。 您不能指派 NULL 值給宣告為 NOT NULL 的參數或變數。 如需詳細資訊,請參閱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.

  • 原生編譯預存程序的結構描述繫結。

原生編譯的儲存程序是使用 CREATE PROCEDURE (Transact-SQL) 建立的。 下列範例會顯示記憶體最佳化的資料表以及用來將資料列插入資料表中的原生編譯預存程序。

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  

在程式碼範例中,NATIVE_COMPILATION 表示這個 Transact-SQL 預存程序是原生編譯的預存程序。 以下是必要的選項:

選項 描述
SCHEMABINDING 原生編譯的預存程序必須繫結至其所參考之物件的結構描述。 這表示,此程序所參照的資料表不能刪除。 此程序中參考的資料表必須包含其結構描述名稱,而且查詢中不允許使用萬用字元 (*) (表示沒有 SELECT * from...)。 只有這個版本 SQL Server 中的原生編譯預存程序才支援 SCHEMABINDING。
開始原子操作 原生編譯的預存程序主體必須恰好包含一個原子區塊。 原子區塊可保證預存程序以原子方式執行。 如果此程序是在作用中的交易情境之外被呼叫,它會啟動一筆新的交易,並在原子區塊結束時提交。 原生編譯的預存程序中的原子區塊有兩個必要的選項:

TRANSACTION ISOLATION LEVEL。 如需支援的隔離等級,請參閱 記憶體最佳化資料表的交易隔離等級 。

LANGUAGE。 預存程序的語言必須設定為其中一個可用語言或語言別名。