Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le colonne calcolate non sono supportate nelle tabelle ottimizzate per la memoria. È tuttavia possibile simulare una colonna calcolata.
Quando si esegue la migrazione delle tabelle basate su disco alle tabelle ottimizzate per la memoria, è necessario considerare la necessità di rendere persistenti le colonne calcolate. Le diverse caratteristiche delle prestazioni delle tabelle ottimizzate per la memoria e delle stored procedure compilate in modo nativo possono negare la necessità di persistenza.
Colonne calcolate non persistenti
Per simulare gli effetti di una colonna calcolata non persistente, creare una vista sulla tabella ottimizzata per la memoria. Nell'istruzione SELECT che definisce la vista, aggiungi la definizione della colonna calcolata nella vista. Ad eccezione di una stored procedure compilata in modo nativo, le query che usano valori della colonna calcolata devono essere lette dalla vista. All'interno di stored procedure compilate in modo nativo, dovresti aggiornare qualsiasi istruzione select, update o delete in base alla tua definizione di colonna calcolata.
-- 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 persistenti
Per simulare gli effetti di una colonna calcolata persistente, crea una procedura memorizzata per inserire i dati nella tabella e un'altra per aggiornarli. Quando si inserisce o si aggiorna la tabella, richiamare queste procedure memorizzate per eseguire queste attività. All'interno delle stored procedure calcolare il valore per il campo calcolato in base agli input, in modo analogo al modo in cui la colonna calcolata viene definita nella tabella originale basata su disco. Quindi, inserire o aggiornare la tabella in base alle esigenze all'interno della 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