Migrazione di colonne calcolateMigrating Computed Columns

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2014)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2014)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Le colonne calcolate non sono supportate nelle tabelle con ottimizzazione per la memoria.Computed columns are not supported in memory-optimized tables. Tuttavia, è possibile simulare una colonna calcolata.However, you can simulate a computed column.

Applies to: SQL Server vNextSQL Server vNext CTP 1.1.Applies to: SQL Server vNextSQL Server vNext CTP 1.1.
A partire da SQL Server vNextSQL Server vNext CTP 1.1, le colonne calcolate sono supportate in indici e tabelle con ottimizzazione per la memoria.Beginning with SQL Server vNextSQL Server vNext CTP 1.1, computed columns are supported in memory-optimized tables and indexes.

Valutare la necessità di rendere persistenti le colonne calcolate quando si esegue la migrazione delle tabelle basate su disco nelle tabelle con ottimizzazione per la memoria.You should consider the need to persist your computed columns when you migrate your disk-based tables to memory-optimized tables. Le diverse caratteristiche di prestazioni delle tabelle con ottimizzazione per la memoria e delle stored procedure compilate in modo nativo possono annullare la necessità della persistenza.The different performance characteristics of memory-optimized tables and natively compiled stored procedures may negate the need for persistence.

Colonne calcolate non persistentiNon-Persisted Computed Columns

Per simulare gli effetti di una colonna calcolata non persistente, creare una vista nella tabella con ottimizzazione per la memoria.To simulate the effects of a non-persisted computed column, create a view on the memory-optimized table. Nell'istruzione SELECT che definisce la vista, aggiungere la definizione della colonna calcolata nella vista.In the SELECT statement that defines the view, add the computed column definition into the view. Ad eccezione di una stored procedure compilata in modo nativo, le query che utilizzano i valori della colonna calcolata devono essere letti dalla vista.Except in a natively compiled stored procedure, queries that use values from the computed column should read from the view. All'interno delle stored procedure compilate in modo nativo, è consigliabile aggiornare tutte le istruzioni SELECT, UPDATE o DELETE in base alla definizione della colonna calcolata.Inside natively compiled stored procedures, you should update any select, update, or delete statement according to your computed column definition.

-- Schema for the table dbo.OrderDetails:  
-- OrderId int not null primary key,  
-- ProductId int not null,  
-- SalePrice money not null,  
-- Quantity int not null,  
-- Total money not null  
--  
-- Total is computed as SalePrice * Quantity and is not persisted.  
CREATE VIEW dbo.v_order_details AS  
   SELECT  
      OrderId,  
      ProductId,  
      SalePrice,  
      Quantity,  
      Quantity * SalePrice AS Total  
   FROM dbo.order_details  

Colonne calcolate persistentiPersisted Computed Columns

Per simulare gli effetti di una colonna calcolata persistente, creare una stored procedure per l'inserimento nella tabella e un'altra stored procedure per l'aggiornamento della tabella.To simulate the effects of a persisted computed column, create a stored procedure for inserting into the table and another stored procedure for updating the table. Quando si inserisce o si aggiorna la tabella, chiamare le stored procedure per eseguire queste attività.When inserting or updating the table, invoke these stored procedures to perform these tasks. All'interno delle stored procedure, calcolare il valore del campo calcolato in base agli input, analogamente al modo in cui viene definita la colonna calcolata nella tabella originale basata su disco.Inside the stored procedures, calculate the value for the computed field according to the inputs, much like how the computed column is defined on the original disk-based table. Quindi, inserire o aggiornare la tabella in base alle esigenze all'interno della stored procedure.Then, insert or update the table as needed inside the stored procedure.

-- Schema for the table dbo.OrderDetails:  
-- OrderId int not null primary key,  
-- ProductId int not null,  
-- SalePrice money not null,  
-- Quantity int not null,  
-- Total money not null  
--  
-- Total is computed as SalePrice * Quantity and is persisted.  
-- we need to create insert and update procedures to calculate Total.  
CREATE PROCEDURE sp_insert_order_details   
@OrderId int, @ProductId int, @SalePrice money, @Quantity int  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS BEGIN ATOMIC WITH (LANGUAGE = N'english', TRANSACTION ISOLATION LEVEL = SNAPSHOT)  
-- compute the value here.   
-- this stored procedure works with single rows only.  
-- for bulk inserts, accept a table-valued parameter into the stored procedure  
-- and use an INSERT INTO SELECT statement.  
DECLARE @total money = @SalePrice * @Quantity  
INSERT INTO dbo.OrderDetails (OrderId, ProductId, SalePrice, Quantity, Total)  
VALUES (@OrderId, @ProductId, @SalePrice, @Quantity, @total)  
END  
GO  

CREATE PROCEDURE sp_update_order_details_by_id  
@OrderId int, @ProductId int, @SalePrice money, @Quantity int  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS BEGIN ATOMIC WITH (LANGUAGE = N'english', TRANSACTION ISOLATION LEVEL = SNAPSHOT)  
-- compute the value here.   
-- this stored procedure works with single rows only.  
DECLARE @total money = @SalePrice * @Quantity  
UPDATE dbo.OrderDetails   
SET ProductId = @ProductId, SalePrice = @SalePrice, Quantity = @Quantity, Total = @total  
WHERE OrderId = @OrderId  
END  
GO  

Vedere ancheSee Also

Migrazione a OLTP in memoriaMigrating to In-Memory OLTP