Поделиться через


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

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

Скомпилированные в собственном коде хранимые процедуры не реализуют полную программируемость 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...). SCHEMABINDING поддерживается только для скомпилированных в собственном коде хранимых процедур в этой версии SQL Server.
BEGIN ATOMIC Тело хранимой процедуры, скомпилированной в собственном коде, должно представлять собой только один блок ATOMIC. Блоки ATOMIC гарантируют атомарное выполнение хранимой процедуры. Если процедура вызывается вне контекста активной транзакции, то запускает новую транзакцию, которая фиксируется после блока ATOMIC. Блоки ATOMIC в хранимых процедурах, скомпилированных в собственном коде, имеют два обязательных параметра:

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

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

См. также

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