Implementazione di un'espressione CASE in una stored procedure compilata in modo nativoImplementing a CASE Expression in a Natively Compiled Stored Procedure

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

Le espressioni CASE sono supportate nelle stored procedure compilate in modo nativo.CASE expressions are supported in natively compiled stored procedures. Nell'esempio seguente viene illustrato come utilizzare l'espressione CASE in una query.The following example demonstrates a way to use the CASE expression in a query. La soluzione alternativa descritta per le espressioni CASE nei moduli compilati in modo nativo non sono più necessarie.The workaround described for CASE expressions in natively compiled modules would be no longer needed.

-- Query using a CASE expression in a natively compiled stored procedure.
CREATE PROCEDURE dbo.usp_SOHOnlineOrderResult  
   WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
   AS BEGIN ATOMIC WITH  (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE=N'us_english')  
   SELECT   
      SalesOrderID,   
      CASE (OnlineOrderFlag)   
      WHEN 1 THEN N'Order placed online by customer'  
      ELSE N'Order placed by sales person'  
      END  
   FROM Sales.SalesOrderHeader_inmem
END  
GO  

EXEC dbo.usp_SOHOnlineOrderResult  
GO  

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 espressioni CASE non sono supportate nelle stored procedure compilate in modo nativo.CASE expressions are not supported in natively compiled stored procedures. L'esempio seguente illustra una modalità di implementazione della funzionalità di un'espressione CASE in una stored procedure compilata in modo nativo.The following sample shows a way to implement the functionality of a CASE expression in a natively compiled stored procedure.

Gli esempi di codice usano una variabile di tabella per costruire un singolo set di risultati.The code samples uses a table variable to construct a single result set. Questa opzione è applicabile solo quando si elabora un numero limitato di righe perché prevede la creazione di un'altra copia delle righe di dati.This is suitable only when processing a limited number of rows, because it involves creating an additional copy of the data rows.

È necessario testare le prestazioni di questa soluzione alternativa.You should test the performance of this workaround.

-- original query  
SELECT   
   SalesOrderID,   
   CASE (OnlineOrderFlag)   
   WHEN 1 THEN N'Order placed online by customer'  
   ELSE N'Order placed by sales person'  
   END  
FROM Sales.SalesOrderHeader_inmem  

--  workaround for CASE in natively compiled stored procedures  
--  use a table for the single resultset  
CREATE TYPE dbo.SOHOnlineOrderResult AS TABLE  
(  
   SalesOrderID uniqueidentifier not null index ix_SalesOrderID,  
     OrderFlag nvarchar(100) not null  
) with (memory_optimized=on)  
go  

-- natively compiled stored procedure that includes the query  
CREATE PROCEDURE dbo.usp_SOHOnlineOrderResult  
   WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
   AS BEGIN ATOMIC WITH  
      (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE=N'us_english')  

   -- table variable for creating the single resultset  
   DECLARE @result dbo.SOHOnlineOrderResult  

   -- CASE OnlineOrderFlag=1  
   INSERT @result   
   SELECT SalesOrderID, N'Order placed online by customer'  
      FROM Sales.SalesOrderHeader_inmem  
      WHERE OnlineOrderFlag=1  

   -- ELSE  
   INSERT @result   
   SELECT SalesOrderID, N'Order placed by sales person'  
      FROM Sales.SalesOrderHeader_inmem  
      WHERE OnlineOrderFlag!=1  

   -- return single resultset  
   SELECT SalesOrderID, OrderFlag FROM @result  
END  
GO  

EXEC dbo.usp_SOHOnlineOrderResult  
GO  

Vedere ancheSee Also

Problemi di migrazione relativi alle stored procedure compilate in modo nativo Migration Issues for Natively Compiled Stored Procedures
Costrutti Transact-SQL non supportati da OLTP in memoria Transact-SQL Constructs Not Supported by In-Memory OLTP