이 항목에는 고유하게 컴파일된 저장 프로시저(CREATE PROCEDURE(Transact-SQL)에 대해 지원되는 기능 목록이 포함되어 있습니다.
고유하게 컴파일된 저장 프로시저에서 지원되는 데이터 형식에 대한 자세한 내용은 지원되는 데이터 형식을 참조하세요.
지원되지 않는 구문에 대한 전체 정보와 고유하게 컴파일된 저장 프로시저에서 지원되지 않는 기능 중 일부를 해결하는 방법에 대한 자세한 내용은 고유하게 컴파일된 저장 프로시저에 대한 마이그레이션 문제를 참조하세요. 지원되지 않는 기능에 대한 자세한 내용은 In-Memory OLTP에서 지원되지 않는Transact-SQL 구문을 참조하세요.
고유하게 컴파일된 저장 프로시저의 프로그래밍 기능
지원되는 내용은 다음과 같습니다.
BEGIN ATOMIC(저장 프로시저의 외부 수준), LANGUAGE, ISOLATION LEVEL, DATEFORMAT 및 DATEFIRST입니다.
변수를 NULL 또는 NOT NULL로 선언합니다. 변수가 NOT NULL로 선언되면 선언에 이니셜라이저가 있어야 합니다. 변수가 NOT NULL로 선언되지 않은 경우 이니셜라이저는 선택 사항입니다.
IF와 WHILE 조건문
삽입/업데이트/삭제
하위 쿼리는 지원되지 않습니다. WHERE 또는 HAVING 절에서 AND 및 BETWEEN이 지원됩니다. OR, NOT 및 IN은 지원되지 않습니다.
메모리 최적화 테이블 형식 및 테이블 변수.
복귀
선택
설정
시도/잡기/던지기 (TRY/CATCH/THROW)
성능을 최적화하려면 고유하게 컴파일된 전체 저장 프로시저에 대해 단일 TRY/CATCH 블록을 사용합니다.
지원되는 연산자
다음 연산자가 지원됩니다.
비교 연산자(Transact-SQL)(예: >, , <>=, <=)는 조건부(IF, WHILE)에서 지원됩니다.
단항 연산자(+, -).
이항 연산자(*, /, +, -, % (모듈로)).
더하기 연산자(+)는 숫자와 문자열 모두에서 지원됩니다.
논리 연산자(AND, OR, NOT). OR 및 NOT은 IF 및 WHILE 문에서 지원되지만 WHERE 또는 HAVING 절에서는 지원되지 않습니다.
비트 연산자 ~, &, |, ^
고유하게 컴파일된 저장 프로시저의 기본 제공 함수
다음 함수는 메모리 최적화 테이블의 기본 제약 조건과 고유하게 컴파일된 저장 프로시저에서 지원됩니다.
수학 함수: ACOS, ASIN, ATAN, ATN2, COS, COT, DEGREES, EXP, LOG, LOG10, PI, POWER, RADIANS, RAND, SIN, SQRT, SQUARE 및 TAN
날짜 함수: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME 및 YEAR.
문자열 함수: LEN, LTRIM, RTRIM 및 SUBSTRING
ID 함수: SCOPE_IDENTITY
NULL 함수: ISNULL은 NULL 값을 처리하는 함수입니다.
Uniqueidentifier 함수: NEWID 및 NEWSEQUENTIALID
오류 함수: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY 및 ERROR_STATE
CAST와 CONVERT 변환. 유니코드와 유니코드가 아닌 문자열(n(var)char 및 (var)char) 간의 변환은 지원되지 않습니다.
시스템 함수: @@rowcount. 네이티브 컴파일된 저장 프로시저 내의 문은 @@rowcount를 업데이트하며, 네이티브 컴파일된 저장 프로시저에서 @@rowcount를 사용하여 해당 프로시저 내에서 마지막으로 실행된 문의 영향을 받은 행 수를 확인할 수 있습니다. 그러나 @@rowcount 고유하게 컴파일된 저장 프로시저 실행이 시작될 때와 실행이 끝날 때 0으로 다시 설정됩니다.
고유하게 컴파일된 저장 프로시저의 쿼리 노출 영역
지원되는 내용은 다음과 같습니다.
사이
열 이름에 대한 별칭 (AS 또는 = 구문을 사용하여).
SELECT 쿼리에서만 지원되는 CROSS JOIN 및 INNER JOIN입니다.
식은 SELECT 목록 및 WHERE(Transact-SQL) 절에서 지원되는 연산자를 사용하는 경우 지원됩니다. 현재 지원되는 연산 자 목록은 지원되는 연산자를 참조하세요.
필터 조건자 IS [NOT] NULL
FROM <메모리 최적화 테이블>
GROUP BY(Transact-SQL) 는 집계 함수 AVG, COUNT, COUNT_BIG, MIN, MAX 및 SUM과 함께 지원됩니다. MIN 및 MAX는 nvarchar, char, varchar, varchar, varbinary 및 binary 형식에 대해 지원되지 않습니다. ORDER BY 목록의 식이 GROUP BY 목록에 축자식으로 표시되는 경우 ORDER BY 절(Transact-SQL)은 GROUP BY(Transact-SQL) 에서 지원됩니다. 예를 들어 GROUP BY a + b ORDER BY a + b는 지원되지만 GROUP BY a, b ORDER BY a + b는 지원되지 않습니다.
HAVING은 WHERE 절과 동일한 식 제한 사항이 적용됩니다.
INSERT VALUES(문당 한 행) 및 INSERT SELECT
정렬 기준 1
열을 참조하지 않는 조건자입니다.
SELECT, UPDATE 및 DELETE
상위 1개
SELECT 목록의 변수 할당입니다.
어디... 그리고
1 ORDER BY 및 TOP은 고유하게 컴파일된 저장 프로시저에서 지원되며 몇 가지 제한 사항이 있습니다.
SELECT또는ORDER BY절에는DISTINCT에 대한 지원이 없습니다.TOP절에서WITH TIES또는PERCENT에 대한 지원은 없습니다.TOP와ORDER BY는TOP절에서 상수를 사용할 때 8,192개를 초과하여 지원하지 않습니다. 쿼리에 조인 또는 집계 함수가 포함된 경우 이 제한을 낮출 수 있습니다. 예를 들어 조인 1개(테이블 2개)를 사용하는 경우 한도는 4,096개 행입니다. 조인 2개(테이블 3개)가 있는 경우 한도는 2,730개 행입니다.변수에 행 수를 저장하여 8,192보다 큰 결과를 얻을 수 있습니다.
DECLARE @v INT = 9000 SELECT TOP (@v) ... FROM ... ORDER BY ...
그러나 절의 상수는 TOP 변수 사용에 비해 성능이 향상됩니다.
이러한 제한은 메모리 최적화 테이블에서 해석된 Transact-SQL 액세스에는 적용되지 않습니다.
감사 활동
프로시저 수준 감사는 고유하게 컴파일된 저장 프로시저에서 지원됩니다. 문장 수준 감사는 지원되지 않습니다.
감사에 대한 자세한 내용은 서버 감사 및 데이터베이스 감사 사양 만들기를 참조하세요.
테이블, 쿼리 및 조인 힌트
지원되는 내용은 다음과 같습니다.
테이블 힌트 구문 또는 쿼리의 OPTION 절(Transact-SQL) 에서 INDEX, FORCESCAN 및 FORCESEEK 힌트를 제공합니다.
명령 강제
내부 루프 조인
최적화
자세한 내용은 힌트(Transact-SQL)를 참조하세요.
정렬에 대한 제한 사항
TOP(Transact-SQL) 및 ORDER BY 절(Transact-SQL)을 사용하는 쿼리에서 8,000개 이상의 행을 정렬할 수 있습니다. 그러나 ORDER BY 절(Transact-SQL)이 없으면 TOP(Transact-SQL) 은 최대 8,000개의 행(조인이 있는 경우 행 수 감소)을 정렬할 수 있습니다.
쿼리에서 TOP(Transact-SQL) 연산자와 ORDER BY 절(Transact-SQL)을 모두 사용하는 경우 TOP 연산자에 대해 최대 8192개의 행을 지정할 수 있습니다. 8192개 이상의 행을 지정하면 오류 메시지가 표시됩니다. Msg 41398, Level 16, State 1, Procedure <procedureName>, Line lineNumber<> TOP 연산자는 최대 8192개의 행을 반환할 수 있습니다. <번호>가 요청되었습니다.
TOP 절이 없는 경우 ORDER BY를 사용하여 여러 행을 정렬할 수 있습니다.
ORDER BY 절을 사용하지 않는 경우 TOP 연산자에 정수 값을 사용할 수 있습니다.
TOP N = 8192를 사용하여 예제: 컴파일
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의 예: 컴파일에 실패합니다.
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 만 적용됩니다. 8192보다 큰 값이 필요한 N 경우 변수에 값을 할당하고 해당 변수를 .와 함께 TOP사용할 수 있습니다.
변수를 사용하는 예제: 컴파일
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 연산자가 반환할 수 있는 행 수를 줄일 수 있는 두 가지 경우가 있습니다.
쿼리에서 JOIN 사용. 제한에 대한 JOIN의 영향은 쿼리 계획에 따라 달라집니다.
ORDER BY 절에서 집계 함수 또는 집계 함수의 참조를 사용하기.
TOP N에서 지원되는 최악의 경우 최대 N을 계산하는 수식은 다음과 N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )같습니다.