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

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

적용 대상: Azure SQL 데이터베이스Azure SQL Database 및 SQL Server SQL Server 2017(14.x)SQL Server 2017 (14.x) 이상Applies to: Azure SQL 데이터베이스Azure SQL Database and SQL Server starting SQL Server 2017(14.x)SQL Server 2017 (14.x)

CASE 식은 고유하게 컴파일된 T-SQL 모듈에서 지원됩니다.CASE expressions are supported in natively compiled T-SQL modules. 다음 예제에서는 쿼리에서 CASE 식을 사용하는 방법을 보여 줍니다.The following example demonstrates a way to use the CASE expression in a query.

-- 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(12.x)SQL Server 2014 (12.x) 및 SQL Server SQL Server 2016(13.x)SQL Server 2016 (13.x) 이상Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) and SQL Server starting SQL Server 2016(13.x)SQL Server 2016 (13.x)

CASE 식은 고유하게 컴파일된 T-SQL 모듈에서 지원되지 않습니다.CASE expressions are not supported in natively compiled T-SQL modules. 다음 예제에서는 고유하게 컴파일된 저장 프로시저에서 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