ネイティブ コンパイル ストアド プロシージャの作成

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

ネイティブ コンパイル ストアド プロシージャには、Transact-SQL のプログラミングとクエリのセキュリティ構成が完全には実装されていません。 ネイティブ コンパイル ストアド プロシージャ内部で使用できない特定の Transact-SQL 構造が存在します。 詳細については、「 ネイティブ コンパイル T-SQL モジュールでサポートされる機能」を参照してください。

次の Transact-SQL 機能は、ネイティブ コンパイル ストアド プロシージャに対してのみサポートされます。

  • ATOMIC ブロック。 詳細については、「 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 がサポートされます。
BEGIN ATOMIC ネイティブ コンパイル ストアド プロシージャの本体は、厳密に 1 つの ATOMIC ブロックで構成されている必要があります。 ATOMIC ブロックでは、ストアド プロシージャのアトミック実行が保証されます。 プロシージャをアクティブなトランザクションのコンテキストの外部で呼び出した場合、新しいトランザクションが開始され、ATOMIC ブロックの末尾でコミットされます。 ネイティブ コンパイル ストアド プロシージャの ATOMIC ブロックには、次の 2 つの必須オプションがあります。

TRANSACTION ISOLATION LEVEL。 サポートされる分離レベルについては、「 メモリ最適化テーブルのトランザクション分離 」を参照してください。

LANGUAGE。 ストアド プロシージャの言語は、使用可能な言語または言語の別名の 1 つに設定されている必要があります。

参照

ネイティブ コンパイル ストアド プロシージャ