고유하게 컴파일된 저장 프로시저에서 CASE 식 구현Implementing a CASE Expression in a Natively Compiled Stored Procedure

이 항목은 다음에 적용됩니다. 예SQL Server(2017부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2017)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

CASE 식은 고유하게 컴파일된 저장 프로시저에서 지원되지 않습니다.CASE expressions are supported in natively compiled stored procedures. 다음 예제에서는 쿼리에서 CASE 식을 사용하는 방법을 보여 줍니다.The following example demonstrates a way to use the CASE expression in a query. 고유하게 컴파일된 모듈의 CASE 식에 대해 설명된 해결 방법은 더 이상 필요하지 않습니다.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  

이 항목은 다음에 적용됩니다.예SQL Server(2014부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2014)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

CASE 식은 고유하게 컴파일된 저장 프로시저에서 지원되지 않습니다 .CASE expressions are not supported in natively compiled stored procedures. 다음 예제에서는 고유하게 컴파일된 저장 프로시저에서 CASE 식의 기능을 구현하는 방법을 보여 줍니다.The following sample shows a way to implement the functionality of a CASE expression in a natively compiled stored procedure.

코드 샘플은 테이블 변수를 사용하여 단일 결과 집합을 생성합니다.The code samples uses a table variable to construct a single result set. 이것은 제한된 수의 행을 처리하는 경우 데이터 행의 추가 복사본을 만들어야 하기 때문에 적절합니다.This is suitable only when processing a limited number of rows, because it involves creating an additional copy of the data rows.

이 방법의 성능을 테스트해야 합니다.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  

참고 항목See Also

고유하게 컴파일된 저장 프로시저의 마이그레이션 문제 Migration Issues for Natively Compiled Stored Procedures
메모리 내 OLTP에서 지원되지 않는 Transact-SQL 구문Transact-SQL Constructs Not Supported by In-Memory OLTP