创建本机编译的存储过程

适用于: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
BEGIN ATOMIC 本机编译的存储过程正文必须由恰好一个原子块构成。 原子块确保存储过程的原子执行。 如果在活动事务的上下文外调用该过程,它将开始一个新事务,这个新事务在原子块的末尾提交。 本机编译存储过程中的原子块具有两个必需的选项:

TRANSACTION ISOLATION LEVEL。 有关支持的隔离级别的信息,请参阅 内存优化表的事务隔离级别

LANGUAGE。 存储过程的语言必须设置为可用语言或语言别名之一。

另请参阅

本机编译的存储过程