Microsoft로 로그인
로그인하거나 계정을 만듭니다.
안녕하세요.
다른 계정을 선택합니다.
계정이 여러 개 있음
로그인할 계정을 선택합니다.

증상

Transact-SQL에서 구현되고 단일 데이터 값을 반환하는 UDF(User-Defined Functions)를 T-SQL 스칼라 User-Defined 함수(UDF)라고 합니다. 

스칼라 UDF 인라인 기능은 Microsoft SQL Server 2019에서 도입되었습니다. 이 기능은 UDF 실행이 기본 병목 상태인 T-SQL 스칼라 UDF를 호출하는 쿼리의 성능을 향상시킬 수 있습니다. T-SQL 스칼라 UDF 인라인은 인라인 가능한 UDF를 관계형 식으로 자동으로 변환합니다. 

이 CU(누적 업데이트)에는 스칼라 UDF 인라인을 사용하는 쿼리가 오류 메시지 또는 예기치 않은 결과를 반환할 수 있는 시나리오에 대해 다음 영역에 대한 몇 가지 수정 사항이 포함되어 있습니다.

  • 형식 불일치 오류는 UDF의 반환 형식이 sql_variant 경우 발생합니다(SQL Server 2019 CU2에 추가됨).

  • sp_executesqlUDF 호출은 실행을 취소합니다(SQL Server 2019 CU2에 추가됨).

  • 연결된 GOTO 명령 없이 레이블을 참조하는 UDF는 잘못된 결과를 반환합니다(SQL Server 2019 CU2에 추가됨).

  • 메모리 부족 조건 및 메모리 누수는 매우 큰 스칼라 UDF(SQL Server 2019 CU2에서 추가됨)로 인해 발생합니다.

  • 조건(IF-ELSE) 문에서 사용되는 초기화되지 않은 변수는 오류를 발생합니다(SQL Server 2019 CU2에 추가됨).

  • UDF에 sql_variant매개 변수(SQL Server 2019 CU7에 추가됨)가 있는 경우 명시적 변환 오류가 발생합니다.

  • 스칼라 함수가 CHECKSUM참조하는 경우 오류가 발생합니다(SQL Server 2019 CU7에 추가됨).

  • 스칼라 식 다시 평가가 많은 UDF 호출은 2019 CU7 SQL Server 추가된 비수익 스케줄러 오류를 일으킬 수 있습니다.

    참고: 이 문제에 대한 수정으로 인해 성능이 저하될 수 있습니다. 이 성능 회귀를 완화하기 위해 TF(추적 플래그) 13156을 켜서 원래 수정을 사용하지 않도록 설정할 수 있습니다.

    Microsoft는 향후 CU에서 사용할 수 있는 이 성능 회귀에 대한 수정 작업을 진행하고 있습니다.

  • UDF 참조 쿼리가 OPTION (RECOMPILE)사용하는 경우 오류가 발생합니다(SQL Server 2019 CU7에 추가됨).

  • 뷰가 인라인 UDF(SQL Server 2019 CU9에 추가됨)를 호출하는 경우 권한 오류가 발생합니다.

  • query_tsql_scalar_udf_inlinedXEvent가 사용되는 경우 액세스 위반이 발생합니다(SQL Server 2019 CU9에 추가됨).

  • 스칼라 UDF 인라인은 QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n쿼리 힌트(SQL Server 2019 CU9에 추가됨)를 준수하지 않기 때문에 일관되지 않은 동작이 발생합니다.

  • 인라인 UDF에는 2019 CU9 SQL Server 추가된 비수익 스케줄러 오류를 일으킬 수 있는 집계가 포함되어 있습니다.

  • 조건부 블록의 동일한 변수에 대한 스칼라 작업 시퀀스 때문에 메모리 부족 오류가 발생합니다(SQL Server 2019 CU9에 추가됨).

  • CU9로 업그레이드한 후 개체가 입력 매개 변수(SQL Server 2019 CU11에 추가됨)로 사용되는 스칼라 인라인 가능 UDF(UDF2)가 있는 UDF1(스칼라 인라인 가능 UDF)을 호출하는 경우 액세스 위반이 발생합니다.

  • UDF를 인라인화하면 오류가 발생하고 오류 코드 6846, 1011 및 107(SQL Server 2019 CU11에 추가됨)이 생성될 수 있습니다.

  • 비 sysadmin 계정으로 실행되는 UDF를 인라인 처리하면 오류 메시지가 반환될 수 있습니다. "현재 명령에서 심각한 오류가 발생했습니다.  결과가 있는 경우 삭제해야 합니다." (SQL Server 2019 CU16에 추가됨).

  • 동의어를 사용하여 UDF 내에서 임시 테이블을 호출하는 경우 액세스 위반이 발생합니다(Microsoft SQL Server 2022 CU1 및 SQL Server 2019 CU19에 추가됨).

  • UDF 정의에 GOTO 레이블과RETURN 문만 포함된 경우 액세스 위반이 발생합니다(SQL Server 2022 CU1 및 SQL Server 2019 CU19에 추가됨).

  • 스칼라 UDF는 스칼라 UDF 인라인 기능이 켜져 있을 때(SQL Server 2022 CU3 및 SQL Server 2019 CU20에서 추가됨) 서로 다른 날짜 및 시간 형식의 결과를 반환합니다.

  • GROUP BY 절이 있는 쿼리가 집계 함수 없이 SELECT 문에 인라인 UDF를 사용하는 경우 덤프 파일이 생성됩니다(SQL Server 2022 CU12 및 2019 CU26 SQL Server 추가됨).

  • "최대 저장 프로시저, 함수, 트리거 또는 뷰 중첩 수준을 초과(제한 32)" 오류는 중첩 수준이 초과되지 않은 경우에도 스칼라 UDF 인라인 기능이 켜져 있는 경우 발생합니다(2022 CU12 및 2019 CU26 SQL Server SQL Server 추가됨).

  • 스칼라 UDF 인라인 기능이 켜져 있는 경우 메모리 손상이 sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf 발생합니다(SQL Server 2022 CU12 및 SQL Server 2019 CU26에 추가됨).

이 누적 업데이트는 다음 시나리오에서도 인라인을 차단합니다.

  • UDF가 UDF가 인라인될 때 결과를 변경할 수 있는 특정 내장 함수(예: @@ROWCOUNT)를 참조하는 경우(SQL Server 2019 CU2에서 추가됨)

  • 집계 함수가 스칼라 UDF에 매개 변수로 전달되는 경우(SQL Server 2019 CU2에 추가됨)

  • UDF가 기본 제공 뷰(예: OBJECT_ID)를 참조하는 경우(SQL Server 2019 CU2에 추가됨)

  • UDF가 XML 메서드를 사용하는 경우(SQL Server 2019 CU4에 추가됨)

  • UDF에ORDER BY절을 사용하지만 TOP 1않는 SELECT문이 포함된 경우(SQL Server 2019 CU4에서 추가됨)

  • SELECT 문이 ORDER BY 절(예: SELECT @x = @x +1 FROM table ORDER BY column_name)과 함께 할당을 수행하는 경우(SQL Server 2019 CU4에서 추가됨)

  • UDF에 여러 RETURN 문이 포함된 경우(SQL Server 2019 CU5에 추가됨)

  • UDF가 RETURN 문에서 호출되는 경우(SQL Server 2019 CU5에 추가됨)

  • UDF가 STRING_AGG 함수를 참조하는 경우(SQL Server 2019 CU5에 추가됨)

  • UDF 정의가 원격 테이블을 참조하는 경우(SQL Server 2019 CU6에 추가됨)

  • UDF 호출 쿼리가 GROUPING SETS, CUBE또는 ROLLUP 사용하는 경우(SQL Server 2019 CU6에서 추가됨).

  • UDF 호출 쿼리에 할당에 대한 UDF 매개 변수로 사용되는 변수(예: SELECT @y=2, @x=UDF(@y))가 포함된 경우(SQL Server 2019 CU6에서 추가됨)

  • UDF가 암호화된 열을 참조하는 경우(SQL Server 2019 CU11에 추가됨)

  • UDF에 WITH XMLNAMESPACES대한 참조가 포함된 경우(SQL Server 2019 CU11에 추가됨)

  • UDF를 호출하는 쿼리에 CTE(Common Table Expressions)가 있는 경우(SQL Server 2019 CU11에 추가됨)

  • UDF 정의에 임시 테이블 또는 임시 테이블의 동의어가 포함된 경우(2022 CU1 및 2019 CU19 SQL Server SQL Server 추가됨)

  • UDF 정의에 여러 할당 열의DISTINCT절과 함께SELECT문이 있는 경우(SQL Server 2022 CU4 및 SQL Server 2019 CU20에 추가됨)

  • UDF에 TABLESAMPLE PERCENT 절 및 여러 변수 할당을 사용하는 SELECT 문이 포함된 경우(SQL Server 2022 CU7에 추가됨)

  • UDF(SQL Server 2022 CU12 및 SQL Server 2019 CU26에 추가됨)가 포함된 인덱싱된 뷰에서 참조하는 테이블에 INSERT 쿼리가 있는 경우

SQL Server 2019 CU2로 업그레이드한 후 SQL Server 2019 CU5로 업그레이드하기 전에 UDF가 인라인화할 수 있는지 여부를 다시 평가해야 합니다. 이렇게 하려면 다음 방법 중 하나를 통해 적격 스칼라 UDF를 새로 고칩니다.

  • 해당 스칼라 UDF에 대해 sp_refreshsqlmodule 실행합니다. 이 시스템 저장 프로시저에 대한 자세한 내용은 sp_refreshsqlmodule(Transact-SQL)를 참조하세요.

  • 기존 정의, 권한 및 설정 속성을 사용하여 기존 스칼라 UDF를 변경하거나 다시 만듭니다. 자세한 내용은 ALTER FUNCTION(Transact-SQL)을 참조하세요.

다음 명령은 기존 인라인 스칼라 UDF의 메타데이터를 새로 고치는 스크립트를 생성합니다.

/*

Generates a script that can be used to refresh all active inlineable scalar UDFs.

Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.

*/

SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)

+ ']'';' AS 'RefreshStatement'

FROM sys.sql_modules

WHERE is_inlineable = 1

AND inline_type = 1;

GO

참고: SQL Server 2019 CU5로 업그레이드한 후 컴파일 중에 자동으로 UDF 인라인 파생을 다시 시작합니다.

해결 방법

이 문제는 SQL Server 대한 다음 누적 업데이트에서 해결되었습니다.

SQL Server 대한 각각의 새로운 누적 업데이트에는 이전 누적 업데이트에 포함된 모든 핫픽스 및 모든 보안 수정 사항이 포함됩니다. SQL Server 대한 최신 누적 업데이트를 확인하세요.

상태

Microsoft는 "적용 대상" 절에 나열한 제품에서 이 문제를 확인했습니다.

참고 자료

Microsoft가 소프트웨어 업데이트를 설명하는 데 사용하는 용어에 대해 알아보세요.

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.

이 정보가 유용한가요?

언어 품질에 얼마나 만족하시나요?
사용 경험에 어떠한 영향을 주었나요?
제출을 누르면 피드백이 Microsoft 제품과 서비스를 개선하는 데 사용됩니다. IT 관리자는 이 데이터를 수집할 수 있습니다. 개인정보처리방침

의견 주셔서 감사합니다!

×