고유하게 컴파일된 T-SQL 모듈에 대해 지원되는 기능Supported Features for Natively Compiled T-SQL Modules

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

이 항목에서는 저장 프로시저(CREATE PROCEDURE(Transact-SQL)), 스칼라 사용자 정의 함수, 인라인 테이블 반환 함수, 트리거 등 고유하게 컴파일된 T-SQL 모듈의 본문에서 지원되는 기능 및 T-SQL 노출 영역 목록을 제공합니다.This topic contains a list of T-SQL surface area and supported features in the body of natively compiled T-SQL modules, such as stored procedures (CREATE PROCEDURE (Transact-SQL)), scalar user-defined functions, inline table-valued functions, and triggers.

네이티브 모듈 정의와 관련하여 지원되는 기능은 고유하게 컴파일된 T-SQL 모듈에 대해 지원되는 DDL을 참조하세요.For supported features around the definition of native modules, see Supported DDL for Natively Compiled T-SQL modules.

네이티브 모듈의 쿼리 노출 영역Query Surface Area in Native Modules

다음과 같은 쿼리 구문이 지원됩니다.The following query constructs are supported:

CASE 식: CASE는 유효한 식이 허용되는 모든 문 및 절에 사용할 수 있습니다.CASE expression: CASE can be used in any statement or clause that allows a valid expression.

  • 적용 대상: SQL Server 2017SQL Server 2017을 참조하세요.Applies to: SQL Server 2017SQL Server 2017.
    SQL Server 2017SQL Server 2017부터 고유하게 컴파일된 T-SQL 모듈에서 CASE 문이 지원됩니다.Beginning with SQL Server 2017SQL Server 2017, CASE statements are now supported for natively compiled T-SQL modules.

SELECT 절:SELECT clause:

  • 열 및 이름 별칭(AS 또는 = 구문 사용)Columns and name aliases (using either AS or = syntax).

  • 스칼라 하위 쿼리Scalar subqueries

    • 적용 대상: SQL Server 2016SQL Server 2016을 참조하세요.Applies to: SQL Server 2016SQL Server 2016. SQL Server 2016SQL Server 2016부터 고유하게 컴파일된 모듈에서 스칼라 하위 쿼리가 지원됩니다.Beginning with SQL Server 2016SQL Server 2016, scalar subqueries are now supported in natively compiled modules.
  • TOPTOP

  • SELECT DISTINCTSELECT DISTINCT

    • 적용 대상: SQL Server 2016SQL Server 2016을 참조하세요.Applies to: SQL Server 2016SQL Server 2016. SQL Server 2016SQL Server 2016부터 고유하게 컴파일된 모듈에서 DISTINCT 연산자가 지원됩니다.Beginning with SQL Server 2016SQL Server 2016, the DISTINCT operator is supported in natively compiled modules.

          DISTINCT aggregates are not supported.  
      
  • UNION 및 UNION ALLUNION and UNION ALL

    • 적용 대상: SQL Server 2016SQL Server 2016을 참조하세요.Applies to: SQL Server 2016SQL Server 2016. SQL Server 2016SQL Server 2016부터 고유하게 컴파일된 모듈에서 UNION 및 UNION ALL 연산자가 지원됩니다.Beginning with SQL Server 2016SQL Server 2016, UNION and UNION ALL operators are now supported in natively compiled modules.
  • 변수 할당Variable assignments

FROM 절:FROM clause:

  • FROM <메모리 액세스에 최적화된 테이블 또는 테이블 변수>FROM <memory optimized table or table variable>

  • FROM <고유하게 컴파일된 인라인 TVF>FROM <natively compiled inline TVF>

  • LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN 및 INNER JOINLEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN and INNER JOIN.

    • 적용 대상: SQL Server 2016SQL Server 2016을 참조하세요.Applies to: SQL Server 2016SQL Server 2016. SQL Server 2016SQL Server 2016부터 고유하게 컴파일된 모듈에서 JOIN이 지원됩니다.Beginning with SQL Server 2016SQL Server 2016, JOINS are now supported in natively compiled modules.
  • 하위 쿼리 [AS] table_alias.Subqueries [AS] table_alias. 자세한 내용은 FROM(Transact-SQL)을 참조하세요.For more information, see FROM (Transact-SQL).

    • 적용 대상: SQL Server 2016SQL Server 2016을 참조하세요.Applies to: SQL Server 2016SQL Server 2016. SQL Server 2016SQL Server 2016부터 고유하게 컴파일된 모듈에서 하위 쿼리가 지원됩니다.Beginning with SQL Server 2016SQL Server 2016, Subqueries are now supported in natively compiled modules.

WHERE 절:WHERE clause:

  • 필터 조건자 IS [NOT] NULLFilter predicate IS [NOT] NULL

  • AND, BETWEENAND, BETWEEN

  • OR, NOT, IN, EXISTSOR, NOT, IN, EXISTS
    • 적용 대상: SQL Server 2016SQL Server 2016을 참조하세요.Applies to: SQL Server 2016SQL Server 2016. SQL Server 2016SQL Server 2016부터 고유하게 컴파일된 모듈에서 OR/NOT/IN/EXISTS 연산자가 지원됩니다.Beginning with SQL Server 2016SQL Server 2016, OR/NOT/IN/EXISTS operators are now supported in natively compiled modules.

GROUP BY 절:GROUP BY clause:

  • AVG, COUNT, COUNT_BIG, MIN, MAX 및 SUM 집계 함수Aggregate functions AVG, COUNT, COUNT_BIG, MIN, MAX, and SUM.

  • MIN 및 MAX는 nvarchar, char, varchar, varchar, varbinary 및 binary 형식에 대해 지원되지 않습니다.MIN and MAX are not supported for types nvarchar, char, varchar, varchar, varbinary, and binary.

ORDER BY 절:ORDER BY clause:

  • ORDER BY 절에서는 DISTINCT 가 지원되지 않습니다.There is no support for DISTINCT in the ORDER BY clause.

  • ORDER BY 목록의 식이 GROUP BY 목록에 정확하게 나타나는 경우 GROUP BY(Transact-SQL)에서 지원됩니다.Is supported with GROUP BY (Transact-SQL) if an expression in the ORDER BY list appears verbatim in the GROUP BY list.

    • 예를 들어, GROUP BY a + b ORDER BY a + b는 지원되지만 GROUP BY a, b ORDER BY a + b는 지원되지 않습니다.For example, GROUP BY a + b ORDER BY a + b is supported, but GROUP BY a, b ORDER BY a + b is not.

HAVING 절:HAVING clause:

  • WHERE 절과 동일한 식 제한 사항이 적용됩니다.Is subject to the same expression limitations as the WHERE clause.

ORDER BY 및 TOP은 고유하게 컴파일된 모듈에서 지원되며, 다음과 같은 몇 가지 제한이 적용됩니다.ORDER BY and TOP are supported in natively compiled modules, with some restrictions

  • WITH TIES 절에서는 PERCENT 또는 TOP 가 지원되지 않습니다.There is no support for WITH TIES or PERCENT in the TOP clause.

  • ORDER BY 절에서는 DISTINCT 가 지원되지 않습니다.There is no support for DISTINCT in the ORDER BY clause.

  • TOP 절에서 상수를 사용할 때 ORDER BYTOP 를 함께 사용할 경우 8,192개 이상은 지원되지 않습니다.TOP combined with ORDER BY does not support more than 8,192 when using a constant in the TOP clause.

    • 쿼리에 조인 또는 집계 함수가 포함되어 있으면 이 제한이 더 낮아질 수 있습니다.This limit may be lowered in case the query contains joins or aggregate functions. 예를 들어, 조인이 하나 있고 테이블이 두 개 있으면 4,096개의 행으로 제한되고,(For example, with one join (two tables), the limit is 4,096 rows. 조인이 두 개 있고 테이블이 세 개 있으면 2,730개의 행으로 제한됩니다.With two joins (three tables), the limit is 2,730 rows.)
    • 변수에 행 수를 저장하여 8,192개 이상의 결과를 가져올 수 있습니다.You can obtain results greater than 8,192 by storing the number of rows in a variable:
DECLARE @v INT = 9000;
SELECT TOP (@v) … FROM … ORDER BY …

하지만 TOP 절에 상수를 사용하면 변수를 사용할 때보다 나은 성능을 가져옵니다.However, a constant in the TOP clause results in better performance compared to using a variable.

고유하게 컴파일된 Transact-SQLTransact-SQL 에 대한 이러한 제한 사항은 메모리 최적화 테이블에 대한 해석된 Transact-SQLTransact-SQL 액세스에는 적용되지 않습니다.These restrictions on natively compiled Transact-SQLTransact-SQL do not apply to interpreted Transact-SQLTransact-SQL access on memory-optimized tables.

데이터 수정Data Modification

다음의 DML 문이 지원됩니다.The following DML statements are supported.

  • INSERT VALUES(문당 하나의 행) 및 INSERT ... SELECTINSERT VALUES (one row per statement) and INSERT ... SELECT

  • UPDATEUPDATE

  • DELETEDELETE

  • WHERE은 UPDATE 및 DELETE 문에서 지원됩니다.WHERE is supported with UPDATE and DELETE statements.

흐름 제어 언어Control-of-flow language

다음의 흐름 제어 언어 구문이 지원됩니다.The following control-of-flow language constructs are supported.

지원되는 연산자Supported Operators

지원되는 연산자는 다음과 같습니다.The following operators are supported.

  • 비교 연산자(Transact-SQL)(예: >, <, >=, <=)Comparison Operators (Transact-SQL) (for example, >, <, >=, and <=)

  • 단항 연산자(+, -).Unary operators (+, -).

  • 이항 연산자(, /, +, -, %(모듈로))Binary operators (, /, +, -, % (modulo)).

           The plus operator (+) is supported on both numbers and strings.  
    
  • 논리 연산자(AND, OR, NOT).Logical operators (AND, OR, NOT).

  • 비트 연산자 ~, &, | 및 ^Bitwise operators ~, &, |, and ^

  • APPLY 연산자APPLY operator

    • 적용 대상: SQL Server 2017SQL Server 2017을 참조하세요.Applies to: SQL Server 2017SQL Server 2017.
      SQL Server 2017SQL Server 2017부터 APPLY 연산자는 고유하게 컴파일된 모듈에서 지원됩니다.Beginning with SQL Server 2017SQL Server 2017, the APPLY operator is supported in natively compiled modules.

고유하게 컴파일된 모듈의 기본 제공 함수Built-in Functions in Natively Compiled Modules

다음 함수는 메모리 최적화 테이블에 대한 제약 조건과 고유하게 컴파일된 T-SQL 모듈에서 지원됩니다.The following functions are supported in constraints on memory-optimized tables and in natively compiled T-SQL modules.

  • 모든 수치 연산 함수(Transact-SQL)All Mathematical Functions (Transact-SQL)

  • 날짜 함수: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME 및 YEARDate functions: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME, and YEAR.

  • 문자열 함수: LEN, LTRIM, RTRIM 및 SUBSTRINGString functions: LEN, LTRIM, RTRIM, and SUBSTRING.

    • 적용 대상: SQL Server 2017SQL Server 2017을 참조하세요.Applies to: SQL Server 2017SQL Server 2017.
      SQL Server 2017SQL Server 2017부터 TRIM, TRANSLATE, CONCAT_WS 등의 기본 제공 함수도 지원됩니다.Beginning with SQL Server 2017SQL Server 2017, the following built-in functions are also supported: TRIM, TRANSLATE, and CONCAT_WS.
  • ID 함수: SCOPE_IDENTITYIdentity functions: SCOPE_IDENTITY

  • NULL 함수: ISNULLNULL functions: ISNULL

  • Uniqueidentifier 함수: NEWID 및 NEWSEQUENTIALIDUniqueidentifier functions: NEWID and NEWSEQUENTIALID

  • JSON 함수JSON functions

    • 적용 대상: SQL Server 2017SQL Server 2017을 참조하세요.Applies to: SQL Server 2017SQL Server 2017.
      SQL Server 2017SQL Server 2017부터 JSON 함수는 고유하게 컴파일된 모듈에서 지원됩니다.Beginning with SQL Server 2017SQL Server 2017, the JSON functions are supported in natively compiled modules.
  • 오류 함수: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY 및 ERROR_STATEError functions: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, and ERROR_STATE

  • 시스템 함수: @@rowcountSystem Functions: @@rowcount. 고유하게 컴파일된 저장 프로시저 내의 문은 @@rowcount를 업데이트합니다. 고유하게 컴파일된 저장 프로시저에서 @@rowcount를 사용하여 고유하게 컴파일된 저장 프로시저 내에서 실행된 마지막 문의 영향을 받는 행의 수를 확인할 수 있습니다.Statements inside natively compiled stored procedures update @@rowcount and you can use @@rowcount in a natively compiled stored procedure to determine the number of rows affected by the last statement executed within that natively compiled stored procedure. 그러나 @@rowcount는 고유하게 컴파일된 저장 프로시저의 실행이 시작될 때와 끝날 때 0으로 다시 설정됩니다.However, @@rowcount is reset to 0 at the start and at the end of the execution of a natively compiled stored procedure.

  • 보안 기능: IS_MEMBER({'group' | 'role'}), IS_ROLEMEMBER ('role' [, 'database_principal']), IS_SRVROLEMEMBER ('role' [, 'login']), ORIGINAL_LOGIN(), SESSION_USER, CURRENT_USER, SUSER_ID(['login']), SUSER_SID(['login'] [, Param2]), SUSER_SNAME([server_user_sid]), SYSTEM_USER, SUSER_NAME, USER, USER_ID(['user']), USER_NAME([id]), CONTEXT_INFO()Security functions: IS_MEMBER({'group' | 'role'}), IS_ROLEMEMBER ('role' [, 'database_principal']), IS_SRVROLEMEMBER ('role' [, 'login']), ORIGINAL_LOGIN(), SESSION_USER, CURRENT_USER, SUSER_ID(['login']), SUSER_SID(['login'] [, Param2]), SUSER_SNAME([server_user_sid]), SYSTEM_USER, SUSER_NAME, USER, USER_ID(['user']), USER_NAME([id]), CONTEXT_INFO().

  • 네이티브 모듈의 실행을 중첩할 수 있습니다.Executions of native modules can be nested.

감사Auditing

프로시저 수준 감사는 고유하게 컴파일된 저장 프로시저에서 지원됩니다.Procedure level auditing is supported in natively compiled stored procedures.

감사에 대한 자세한 내용은 Create a Server Audit and Database Audit Specification를 참조하세요.For more information about auditing, see Create a Server Audit and Database Audit Specification.

테이블 및 쿼리 힌트Table and Query Hints

다음 항목이 지원됩니다.The following are supported:

정렬의 제한 사항Limitations on Sorting

TOP(Transact-SQL)ORDER BY 절(Transact-SQL)을 사용하는 쿼리에서는 8,000개 이상의 행을 정렬할 수 있습니다.You can sort greater than 8,000 rows in a query that uses TOP (Transact-SQL) and an ORDER BY Clause (Transact-SQL). 하지만 ORDER BY 절(Transact-SQL)이 없을 경우, TOP(Transact-SQL)은 최대 8,000개까지만 행을 정렬할 수 있습니다. 조인이 있으면 이러한 행 수가 더 줄어듭니다.However, without ORDER BY Clause (Transact-SQL), TOP (Transact-SQL) can sort up to 8,000 rows (fewer rows if there are joins).

쿼리에서 TOP(Transact-SQL) 연산자와 ORDER BY 절(Transact-SQL)을 모두 사용하는 경우 TOP 연산자에 대해 최대 8192행을 지정할 수 있습니다.If your query uses both the TOP (Transact-SQL) operator and an ORDER BY Clause (Transact-SQL), you can specify up to 8192 rows for the TOP operator. 8192행보다 더 많이 지정하면 다음 오류 메시지가 나타납니다. 메시지 41398, 수준 16, 상태 1, 프로시저 <procedureName>, 줄 <lineNumber> TOP 연산자는 최대 8192개의 행을 반환할 수 있습니다. <number>개가 요청되었습니다.If you specify more than 8192 rows you get the error message: Msg 41398, Level 16, State 1, Procedure <procedureName>, Line <lineNumber> The TOP operator can return a maximum of 8192 rows; <number> was requested.

TOP 절을 사용하지 않는 경우 ORDER BY를 사용하여 몇 행이든 정렬할 수 있습니다.If you do not have a TOP clause, you can sort any number of rows with ORDER BY.

ORDER BY 절을 사용하지 않는 경우 TOP 연산자와 함께 어떤 정수 값이든 사용할 수 있습니다.If you do not use an ORDER BY clause, you can use any integer value with the TOP operator.

TOP N = 8192인 경우의 예: 컴파일Example with TOP N = 8192: Compiles

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8192 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

TOP N > 8192인 경우의 예: 컴파일 실패Example with TOP N > 8192: Fails to compile.

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8193 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

8192 행 제한은 TOP N 에만 적용됩니다. 여기서 N 은 앞의 예와 같이 상수입니다.The 8192 row limitation only applies to TOP N where N is a constant, as in the preceding examples. 8192보다 큰 N 이 필요한 경우 값을 변수에 할당하고 이 변수를 TOP과 함께 사용할 수 있습니다.If you need N greater than 8192 you can assign the value to a variable and use that variable with TOP.

변수 사용의 예: 컴파일Example using a variable: Compiles

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    DECLARE @v int = 8193   
    SELECT TOP (@v) ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

반환된 행에 대한 제한: TOP 연산자에서 반환할 수 있는 행 수를 잠재적으로 줄일 수 있는 두 가지 경우는 다음과 같습니다.Limitations on rows returned: There are two cases where that can potentially reduce the number of rows that can be returned by the TOP operator:

  • 쿼리에서 JOIN 사용.Using JOINs in the query. JOIN이 제한에 미치는 영향은 쿼리 계획에 따라 다릅니다.The influence of JOINs on the limitation depends on the query plan.

  • 집계 함수 또는 참조를 사용하여 ORDER BY 절에서 함수 집계.Using aggregate functions or references to aggregate functions in the ORDER BY clause.

    TOP N에서 지원되는 최대 N의 경우를 계산하는 공식은 N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )입니다.The formula to calculate a worst case maximum supported N in TOP N is: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

관련 항목:See Also

고유하게 컴파일된 저장 프로시저 Natively Compiled Stored Procedures
고유하게 컴파일된 저장 프로시저의 마이그레이션 문제Migration Issues for Natively Compiled Stored Procedures