Создание хранимых процедур, скомпилированных в собственном коде

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Нативно компилируемые хранимые процедуры не поддерживают в полном объёме все возможности программирования и запросов 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...). SCHEMABINDING поддерживается только для скомпилированных в собственном коде хранимых процедур в этой версии SQL Server.
НАЧАТЬ АТОМАРНУЮ ОПЕРАЦИЮ Тело изначально скомпилированной хранимой процедуры должно состоять ровно из одного блока ATOMIC. Блоки ATOMIC гарантируют атомарное выполнение хранимой процедуры. Если процедура вызывается вне контекста активной транзакции, она запустит новую транзакцию, которая фиксируется в конце блока ATOMIC. Блоки ATOMIC в изначально компилируемых хранимых процедурах имеют два обязательных параметра:

TRANSACTION ISOLATION LEVEL. См. раздел Уровни изоляции транзакций у оптимизированных для памяти таблиц , содержащий описание поддерживаемых уровней изоляции.

LANGUAGE. Для хранимой процедуры необходимо установить один из доступных языков или псевдонимов языков.

См. также

Скомпилированные в собственном коде хранимые процедуры