적용 대상:SQL 서버
Azure SQL 데이터베이스
Azure SQL 관리 인스턴스
Microsoft Fabric의 SQL 데이터베이스
Transact-SQL 또는 CLR(공용 언어 런타임) 루틴인 UDF(사용자 정의 함수)를 만듭니다. 사용자 정의 함수는 매개 변수를 수락하고, 복잡한 계산과 같은 작업을 수행하고, 해당 작업의 결과를 값으로 반환합니다. 반환 값은 스칼라(single) 값 또는 테이블일 수 있습니다.
다음과 같은 방법으로 사용할 수 있는 재사용 가능한 T-SQL 루틴을 만드는 데 사용합니다 CREATE FUNCTION
.
- Transact-SQL 다음과 같은 진술에서
SELECT
- 함수를 호출하는 응용 프로그램In applications that call the function
- 다른 사용자 정의 함수(user-defined function)의 정의에서
- 뷰를 매개 변수화하거나 인덱싱된 뷰의 기능을 개선하려면
- 테이블에서 열을 정의하려면
- 열에 대한
CHECK
제약 조건을 정의하려면 - 저장 프로시저를 바꾸려면
- 인라인 함수를 보안 정책에 대한 필터 조건자로 사용
이 기사에서는 .NET Framework CLR을 SQL Server에 통합하는 방법에 대해 설명합니다. CLR 통합은 Azure SQL Database에 적용되지 않습니다.
비고
Microsoft Fabric Data Warehouse 또는 Azure Synapse Analytics의 경우 CREATE FUNCTION(Azure Synapse Analytics 및 Microsoft Fabric)을 참조하세요.
팁 (조언)
해당 이름으로 함수가 없는 경우 새 함수를 만들거나 단일 문에서 기존 함수를 변경하도록 지정할 CREATE OR ALTER FUNCTION
수 있습니다.
문법
Transact-SQL 스칼라 함수에 대한 구문입니다.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ , ...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
Transact-SQL 인라인 테이블 반환 함수에 대한 구문입니다.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS TABLE
[ WITH <function_option> [ , ...n ] ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Transact-SQL 다중 문 테이블 반환 함수에 대한 구문입니다.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS @return_variable TABLE <table_type_definition>
[ WITH <function_option> [ , ...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
[ ; ]
Transact-SQL 함수 절에 대한 구문입니다.
<function_option> ::=
{
[ ENCRYPTION ]
| [ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
| [ INLINE = { ON | OFF } ]
}
<table_type_definition> ::=
( { <column_definition> <column_constraint>
| <computed_column_definition> }
[ <table_constraint> ] [ , ...n ]
)
<column_definition> ::=
{
{ column_name data_type }
[ [ DEFAULT constant_expression ]
[ COLLATE collation_name ] | [ ROWGUIDCOL ]
]
| [ IDENTITY [ (seed , increment ) ] ]
[ <column_constraint> [ ...n ] ]
}
<column_constraint> ::=
{
[ NULL | NOT NULL ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
[ ON { filegroup | "default" } ] ]
| [ CHECK ( logical_expression ) ] [ , ...n ]
}
<computed_column_definition> ::=
column_name AS computed_column_expression
<table_constraint> ::=
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
( column_name [ ASC | DESC ] [ , ...n ]
[ WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
| [ CHECK ( logical_expression ) ] [ , ...n ]
}
<index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
}
CLR 스칼라 함수에 대한 구문입니다.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] }
[ , ...n ]
)
RETURNS { return_data_type }
[ WITH <clr_function_option> [ , ...n ] ]
[ AS ] EXTERNAL NAME <method_specifier>
[ ; ]
CLR 테이블 반환 함수에 대한 구문입니다.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] }
[ , ...n ]
)
RETURNS TABLE <clr_table_type_definition>
[ WITH <clr_function_option> [ , ...n ] ]
[ ORDER ( <order_clause> ) ]
[ AS ] EXTERNAL NAME <method_specifier>
[ ; ]
CLR 함수 절에 대한 구문입니다.
<order_clause> ::=
{
<column_name_in_clr_table_type_definition>
[ ASC | DESC ]
} [ , ...n ]
<method_specifier> ::=
assembly_name.class_name.method_name
<clr_function_option> ::=
{
[ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
}
<clr_table_type_definition> ::=
( { column_name data_type } [ , ...n ] )
고유하게 컴파일된 스칼라 사용자 정의 함수에 대한 메모리 내 OLTP 구문입니다.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ NULL | NOT NULL ] [ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS return_data_type
WITH <function_option> [ , ...n ]
[ AS ]
BEGIN ATOMIC WITH (set_option [ , ... n ] )
function_body
RETURN scalar_expression
END
<function_option> ::=
{
| NATIVE_COMPILATION
| SCHEMABINDING
| [ EXECUTE_AS_Clause ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
주장들
또는 ALTER
적용 대상: SQL Server 2016(13.x) SP 1 이상 버전 및 Azure SQL Database.
함수가 이미 존재하는 경우에만 조건부로 함수를 변경합니다.
선택적 OR ALTER
구문은 SQL Server 2016(13.x) SP 1 CU 1부터 CLR에 사용할 수 있습니다.
schema_name
사용자 정의 함수(UDF)가 속한 스키마의 이름입니다.
function_name
사용자 정의 함수의 이름입니다. 함수 이름은 식별자 에 대한 규칙을 따라야 하며 데이터베이스 및 해당 스키마에서 고유해야 합니다.
함수 이름 뒤에 괄호는 매개 변수가 지정되지 않은 경우에도 필요합니다.
@parameter_name
사용자 정의 함수(UDF)의 매개 변수입니다. 하나 이상의 매개 변수를 선언할 수 있습니다.
함수에는 최대 2,100개의 매개 변수가 있을 수 있습니다. 선언된 각 매개 변수의 값은 매개 변수에 대한 기본값이 정의되지 않는 한 함수가 실행될 때 사용자가 제공해야 합니다.
at 기호(@)를 첫 번째 문자로 사용하여 매개 변수 이름을 지정합니다. 매개 변수 이름은 식별자에 대한 규칙을 따라야 합니다. 매개 변수는 함수에 로컬입니다. 다른 함수에서도 동일한 매개 변수 이름을 사용할 수 있습니다. 매개변수는 상수만 대신할 수 있습니다. 테이블 이름, 열 이름 또는 다른 데이터베이스 개체의 이름 대신 사용할 수 없습니다.
ANSI_WARNINGS
저장 프로시저, 사용자 정의 함수에서 매개 변수를 전달하거나 Batch 문에서 변수를 선언하고 설정할 때 적용되지 않습니다. 예를 들어 변수가 char(3)로 정의된 경우 3자보다 큰 값으로 설정하면 해당 데이터가 정의된 크기로 잘리고 INSERT
또는 UPDATE
문은 성공합니다.
[ type_schema_name. ] parameter_data_type
매개 변수 데이터 형식 및 선택적으로 매개 변수가 속한 스키마입니다. Transact-SQL 함수의 경우 timestamp 데이터 형식을 제외한 CLR 사용자 정의 형식 및 사용자 정의 테이블 형식을 포함한 모든 데이터 형식을 사용할 수 있습니다. CLR 함수의 경우 text, ntext, image, 사용자 정의 테이블 형식 및 timestamp 데이터 형식을 제외한 CLR 사용자 정의 형식을 포함한 모든 데이터 형식을 사용할 수 있습니다. 비 스칼라 형식인 cursor 및 table은 Transact-SQL 또는 CLR 함수에서 매개 변수 데이터 형식으로 지정할 수 없습니다.
type_schema_name 지정되지 않은 경우 데이터베이스 엔진은 다음 순서대로 scalar_parameter_data_type
찾습니다.
- SQL Server 시스템 데이터 형식의 이름을 포함하는 스키마입니다.
- 현재 데이터베이스에 있는 현재 사용자의 기본 스키마
- 현재 데이터베이스의
dbo
스키마
[ = 기본값 ]
매개 변수의 기본값입니다. 기본값이 정의되면 해당 매개 변수에 대한 값을 지정하지 않고 함수를 실행할 수 있습니다.
CLR 함수에 대해 varchar(max) 및 varbinary(max) 데이터 형식을 제외한 기본 매개 변수 값을 지정할 수 있습니다.
함수의 매개변수에 기본값이 있는 경우, 기본값을 검색하기 위해 함수가 호출될 때 키워드 DEFAULT
를 지정해야 합니다. 이 동작은 저장 프로시저에서 기본값이 있는 매개 변수를 사용하는 것과는 다르며, 매개 변수를 생략하면 기본값도 포함됩니다. 그러나 DEFAULT
문을 사용하여 스칼라 함수를 호출할 때는 키워드가 EXECUTE
필요하지 않습니다.
읽기 전용
매개 변수를 함수 정의 내에서 업데이트하거나 수정할 수 없음을 나타냅니다.
READONLY
TVP(사용자 정의 테이블 형식 매개 변수)에 필요하며 다른 매개 변수 형식에는 사용할 수 없습니다.
return_data_type
스칼라 사용자 정의 함수의 반환 값입니다. Transact-SQL 함수의 경우 timestamp 데이터 형식을 제외한 CLR 사용자 정의 형식을 포함한 모든 데이터 형식을 사용할 수 있습니다. CLR 함수의 경우 text, ntext, image 및 timestamp 데이터 형식을 제외한 CLR 사용자 정의 형식을 포함한 모든 데이터 형식을 사용할 수 있습니다. 스칼라가 아닌 형식인 cursor 및 table은 Transact-SQL 또는 CLR 함수에서 반환 데이터 형식으로 지정할 수 없습니다.
function_body
테이블 수정과 같은 부작용을 일으키지 않는 일련의 Transact-SQL 문이 함수의 값을 정의하도록 지정합니다. function_body 는 스칼라 함수 및 MSTVF(다중 문 테이블 반환 함수)에서만 사용됩니다.
스칼라 함수에서 function_body 는 함께 스칼라 값으로 평가되는 일련의 Transact-SQL 문입니다.
MSTVF에서 function_body 는 반환 변수를 채우는 일련의 Transact-SQL 문입니다 TABLE
.
scalar_expression
스칼라 함수가 반환하는 스칼라 값을 지정합니다.
테이블
TVF(테이블 반환 함수)의 반환 값이 테이블임을 지정합니다. 상수와 @local_variables 만 TVF에 전달할 수 있습니다.
인라인 TVF에서 TABLE
반환 값은 단일 SELECT
문을 통해 정의됩니다. 인라인 함수에는 연결된 반환 변수가 없습니다.
MSTVF(다중 문 테이블 반환 함수)에서 @return_variable 함수의 값으로 반환되어야 하는 행을 저장하고 누적하는 데 사용되는 변수입니다 TABLE
.
@
return_variable 는 Transact-SQL 함수에만 지정할 수 있으며 CLR 함수에는 지정할 수 없습니다.
select_stmt
인라인 TVF(테이블 반환 함수)의 반환 값을 정의하는 단일 SELECT
문입니다.
주문 (<order_clause>)
테이블 반환 함수에서 결과가 반환되는 순서를 지정합니다. 자세한 내용은 이 문서의 뒷부분에 있는 CLR 테이블 반환 함수에서 정렬 순서 사용 섹션을 참조하십시오.
외부 이름 <method_specifier>assembly_name.class_name. method_name
적용 대상: SQL Server 2008(10.0.x) SP 1 이상 버전.
생성된 함수 이름이 참조할 어셈블리와 메서드를 지정합니다.
assembly_name - 의 열에
name
있는SELECT * FROM sys.assemblies;
값과 일치해야 합니다.문에
CREATE ASSEMBLY
사용된 이름입니다.class_name - 의 열에
assembly_name
있는SELECT * FROM sys.assembly_modules;
값과 일치해야 합니다.값에는 마침표나 점이 포함된 경우가 많습니다. 이러한 경우 Transact-SQL 구문을 사용하려면 값이 한 쌍의 대괄호()
[]
또는 한 쌍의 큰따옴표()""
로 제한되어야 합니다.method_name - 의
method_name
열에 있는SELECT * FROM sys.assembly_modules;
값과 일치해야 합니다.메서드는 정적이어야 합니다.
모든 유형이 네임스페이스 MyFood.dll
에 MyFood
있는 에 대한 일반적인 예에서 EXTERNAL NAME
값은 다음과 같을 MyFood.[MyFood.MyClass].MyStaticMethod
수 있습니다.
기본적으로 SQL Server는 CLR 코드를 실행할 수 없습니다. 공용 언어 런타임 모듈을 참조하는 데이터베이스 개체를 만들고, 수정하고, 삭제할 수 있습니다. 그러나 clr enabled 옵션을 사용하도록 설정할 때까지 SQL Server 이러한 참조를 실행할 수 없습니다. 이 옵션을 활성화하려면 sp_configure 사용합니다. 이 옵션은 포함된 데이터베이스에서 사용할 수 없습니다.
< > table_type_definition ( { <column_definition><column_constraint | <> computed_column_definition } [ <table_constraint> ] [ , ... n ] )
Transact-SQL 함수에 대한 테이블 데이터 형식을 정의합니다. 테이블 선언에는 열 정의와 열 또는 테이블 제약 조건이 포함됩니다. 테이블은 항상 주 파일 그룹에 배치됩니다.
< > clr_table_type_definition ( { column_namedata_type } [ , ... n ] )
적용 대상: SQL Server 2008(10.0.x) SP 1 이상 버전 및 Azure SQL Database(일부 지역에서는 미리 보기).
CLR 함수에 대한 테이블 데이터 형식을 정의합니다. 테이블 선언에는 열 이름과 데이터 형식만 포함됩니다. 테이블은 항상 주 파일 그룹에 배치됩니다.
NULL | NOT NULL
고유하게 컴파일된 스칼라 사용자 정의 함수에 대해서만 지원됩니다. 자세한 내용은 In-Memory OLTP에 대한 스칼라 User-Defined 함수를 참조하세요.
네이티브 컴파일레이션
사용자 정의 함수(UDF)가 고유하게 컴파일되는지 여부를 나타냅니다. 이 인수는 고유하게 컴파일된 스칼라 사용자 정의 함수에 필요합니다.
원자 시작
고유하게 컴파일된 스칼라 사용자 정의 함수에만 필요하며 지원됩니다. 자세한 내용은 Atomic Blocks in Native Procedures를 참조하십시오.
스키마바인딩
이 SCHEMABINDING
인수는 고유하게 컴파일된 스칼라 사용자 정의 함수에 필요합니다.
으로 실행
EXECUTE AS
고유하게 컴파일된 스칼라 사용자 정의 함수에 필요합니다.
< > function_option ::= 및 <clr_function_option> ::=
함수에 다음 옵션 중 하나 이상이 있음을 지정합니다.
암호화
적용 대상: SQL Server 2008(10.0.x) SP 1 이상 버전.
데이터베이스 엔진에서 문의 원래 텍스트를 CREATE FUNCTION
난독 처리된 형식으로 변환함을 나타냅니다. 난독 처리의 출력은 카탈로그 보기에서 직접 볼 수 없습니다. 시스템 테이블 또는 데이터베이스 파일에 대한 액세스 권한이 없는 사용자는 난독 처리된 텍스트를 검색할 수 없습니다. 그러나 데이터베이스 관리자의 진단 연결을 통해 시스템 테이블에 액세스하거나 데이터베이스 파일에 직접 액세스할 수 있는 권한이 있는 사용자가 텍스트를 사용할 수 있습니다. 또한 서버 프로세스에 디버거를 연결할 수 있는 사용자는 런타임에 메모리에서 원래 프로시저를 검색할 수 있습니다. 시스템 메타데이터 액세스에 대한 자세한 내용은 메타데이터 가시성 구성을 참조하십시오.
이 옵션을 사용하면 함수가 SQL Server 복제의 일부로 게시되지 않습니다. CLR 함수에는 이 옵션을 지정할 수 없습니다.
스키마바인딩
함수가 참조하는 데이터베이스 개체에 바인딩되도록 지정합니다. 가 지정되면 SCHEMABINDING
기본 객체는 함수 정의에 영향을 주는 방식으로 수정할 수 없습니다. 함수 정의 자체를 먼저 수정하거나 삭제하여 수정할 개체에 대한 종속성을 제거해야 합니다.
참조하는 개체에 대한 함수의 바인딩은 다음 작업 중 하나가 발생하는 경우에만 제거됩니다.
- 함수가 삭제됩니다.
- 함수는 옵션이 지정되지 않은 명령문
ALTER
을SCHEMABINDING
사용하여 수정됩니다.
함수는 다음 조건이 충족되는 경우에만 스키마 바인딩될 수 있습니다.
- 이 함수는 Transact-SQL 함수입니다.
- 함수에서 참조하는 사용자 정의 함수와 뷰도 스키마 바인딩됩니다.
- 함수에서 참조하는 개체는 두 부분으로 구성된 이름을 사용하여 참조됩니다.
- 함수와 함수가 참조하는 개체는 동일한 데이터베이스에 속합니다.
- 문을 실행
CREATE FUNCTION
한 사용자는 함수가 참조하는 데이터베이스 개체에 대한 사용 권한을 가지고REFERENCES
있습니다.
NULL 입력에 NULL을 반환합니다. NULL 입력에서 호출됩니다.
OnNULLCall
스칼라 함수의 속성을 지정합니다. 지정하지 CALLED ON NULL INPUT
않으면 기본적으로 암시됩니다. 즉, 함수 본문은 인수로 전달되더라도 NULL
실행됩니다.
CLR 함수에 지정된 경우 RETURNS NULL ON NULL INPUT
SQL Server가 받은 NULL
인수 중 하나가 일 때 실제로 함수 본문을 호출하지 않고 반환할 NULL
수 있음을 나타냅니다. 에 <method_specifier>
지정된 CLR 함수의 메서드에 이미 를 RETURNS NULL ON NULL INPUT
나타내는 CREATE FUNCTION
사용자 지정 특성이 있지만 문이 를 나타내는 CALLED ON NULL INPUT
경우 문이 CREATE FUNCTION
우선합니다.
OnNULLCall
CLR 테이블 반환 함수에 대해서는 특성을 지정할 수 없습니다.
으로 실행
사용자 정의 함수(UDF)가 실행되는 보안 컨텍스트를 지정합니다. 따라서 SQL Server에서 함수에서 참조하는 데이터베이스 개체에 대한 사용 권한의 유효성을 검사하는 데 사용하는 사용자 계정을 제어할 수 있습니다.
EXECUTE AS
인라인 테이블 반환 함수에 대해 지정할 수 없습니다.
자세한 내용은 EXECUTE AS 절(Transact-SQL)을 참조하세요.
인라인 = { 켜기 | 끄기 }
적용 대상: SQL Server 2019(15.x) 이상 버전 및 Azure SQL Database.
이 스칼라 UDF를 인라인해야 하는지 여부를 지정합니다. 이 절은 스칼라 사용자 정의 함수에만 적용됩니다. 이 조항은 INLINE
필수 사항이 아닙니다. 절이 INLINE
지정되지 않으면 UDF가 인라인화할 수 있는지 여부에 따라 자동으로 또는 ON
OFF
설정됩니다.
INLINE = ON
가 지정되었지만 UDF가 인라인화할 수 없는 것으로 확인되면 오류가 발생합니다. 자세한 내용은 스칼라 UDF 인라인참조하세요.
< > column_definition ::=
테이블 데이터 형식을 정의합니다. 테이블 선언에는 열 정의와 제약 조건이 포함됩니다. CLR 함수의 경우 column_name 및 data_type 만 지정할 수 있습니다.
column_name
테이블에 있는 열의 이름입니다. 열 이름은 식별자에 대한 규칙을 따라야 하며 테이블에서 고유해야 합니다. column_name 는 1자에서 128자까지 구성할 수 있습니다.
data_type
열 데이터 형식을 지정합니다. Transact-SQL 함수의 경우 timestamp를 제외한 CLR 사용자 정의 형식을 포함한 모든 데이터 형식이 허용됩니다. CLR 함수의 경우 text, ntext, image, char, varchar, varchar(max) 및 timestamp를 제외한 CLR 사용자 정의 형식을 포함한 모든 데이터 형식을 사용할 수 있습니다. 비 스칼라 형식 커서는 Transact-SQL 또는 CLR 함수에서 열 데이터 형식으로 지정할 수 없습니다.
기본 constant_expression
삽입 중에 값이 명시적으로 지정되지 않은 경우에 열에 대해 제공되는 값을 지정합니다.
constant_expression 는 상수 NULL
또는 시스템 함수 값입니다.
DEFAULT
정의는 속성이 있는 열을 제외한 모든 열에 적용할 수 있습니다 IDENTITY
.
DEFAULT
CLR 테이블 반환 함수에 대해 지정할 수 없습니다.
한 부씩 collation_name
열에 대한 데이터 정렬을 지정합니다. 지정하지 않으면 데이터베이스에 데이터베이스의 기본 데이터 정렬이 할당됩니다. 데이터 정렬 이름으로는 Windows 데이터 정렬 이름 또는 SQL 데이터 정렬 이름을 사용할 수 있습니다. 데이터 정렬에 대한 목록 및 자세한 내용은 Windows 데이터 정렬 이름(Transact-SQL) 및 SQL Server 데이터 정렬 이름(Transact-SQL)을 참조하십시오.
이 COLLATE
절은 char, varchar, nchar 및 nvarchar 데이터 형식의 열에 대한 데이터 정렬만 변경하는 데 사용할 수 있습니다.
COLLATE
CLR 테이블 반환 함수에 대해 지정할 수 없습니다.
ROWGUIDCOL
새 열이 행 GLOBALLY 고유 식별자 열임을 나타냅니다. 테이블당 하나의 uniqueidentifier 열만 열로 지정할 수 있습니다 ROWGUIDCOL
.
ROWGUIDCOL
속성은 uniqueidentifier 열에만 할당할 수 있습니다.
이 ROWGUIDCOL
속성은 열에 저장된 값의 고유성을 적용하지 않습니다. 또한 테이블에 삽입된 새 행에 대한 값을 자동으로 생성하지 않습니다. 각 열에 대해 고유한 값을 생성하려면 명령문에 대한 NEWID
함수를 사용합니다INSERT
. 기본값을 지정할 수 있습니다. NEWID
그러나 기본값으로 지정할 수 없습니다.
정체성
새 열이 ID 열임을 나타냅니다. 테이블에 새 행이 추가되면 SQL Server는 열에 대해 고유한 증분 값을 제공합니다. ID 열은 일반적으로 제약 조건과 PRIMARY KEY
함께 사용되어 테이블의 고유 행 식별자 역할을 합니다. 이 IDENTITY
속성은 tinyint, smallint, int, bigint, decimal(p,0) 또는 numeric(p,0) 열에 할당할 수 있습니다. ID 열은 테이블당 하나만 만들 수 있습니다. 바인딩된 기본값 및 DEFAULT
제약 조건은 ID 열과 함께 사용할 수 없습니다.
초기값과증가를 모두 지정하거나 둘 다 지정하지 않아야 합니다. 둘 다 지정하지 않은 경우에는 기본값 (1,1)이 사용됩니다.
IDENTITY
CLR 테이블 반환 함수에 대해 지정할 수 없습니다.
씨
테이블의 첫 번째 행에 할당될 정수 값입니다.
증가
테이블에서 연속된 행의 시드 값에 추가할 정수 값입니다.
< > column_constraint ::= 및 <table_constraint> ::=
지정된 열 또는 테이블에 대한 제약 조건을 정의합니다. CLR 함수의 경우 허용되는 NULL
유일한 제약 조건 유형은 입니다. 명명된 제약 조건은 허용되지 않습니다.
NULL | NOT NULL
열에 Null 값이 허용되는지 여부를 결정합니다.
NULL
엄밀히 말하면 제약 조건은 아니지만 와 같이 NOT NULL
지정할 수 있습니다.
NOT NULL
CLR 테이블 반환 함수에 대해 지정할 수 없습니다.
기본 키
고유 인덱스를 통해 지정된 컬럼에 대한 엔티티 무결성을 적용하는 제약 조건입니다. 테이블 반환 사용자 정의 함수에서는 PRIMARY KEY
테이블당 하나의 열에만 제약 조건을 만들 수 있습니다.
PRIMARY KEY
CLR 테이블 반환 함수에 대해 지정할 수 없습니다.
독특한
지정한 열에 대해 고유 인덱스를 통해 엔터티 무결성을 적용하는 제약 조건입니다. 테이블에는 여러 UNIQUE
제약 조건이 있을 수 있습니다.
UNIQUE
CLR 테이블 반환 함수에 대해 지정할 수 없습니다.
CLUSTERED | 비클러스터형
클러스터형 또는 비클러스터형 인덱스가 or PRIMARY KEY
제약 조건에 대해 UNIQUE
생성되었음을 나타냅니다.
PRIMARY KEY
제약 조건은 를 CLUSTERED
사용하고 UNIQUE
제약 조건은 를 사용합니다NONCLUSTERED
.
CLUSTERED
하나의 제약 조건에 대해서만 지정할 수 있습니다. 제약 조건에 대해 CLUSTERED
지정되고 제약 조건도 UNIQUE
지정 PRIMARY KEY
PRIMARY KEY
되는 경우 NONCLUSTERED
.
CLUSTERED
NONCLUSTERED
CLR 테이블 반환 함수에 대해 지정할 수 없습니다.
확인
열에 입력 가능한 값을 제한하여 도메인 무결성을 적용하는 제약 조건입니다.
CHECK
CLR 테이블 반환 함수에 대해서는 제약 조건을 지정할 수 없습니다.
logical_expression
또는 TRUE
를 반환하는 FALSE
논리 표현식입니다.
< > computed_column_definition ::=
계산 열을 지정합니다. 계산 열에 대한 자세한 내용은 CREATE TABLE(Transact-SQL)을 참조하세요.
column_name
계산 열의 이름입니다.
computed_column_expression
계산 열의 값을 정의하는 식입니다.
< > index_option ::=
또는 PRIMARY KEY
인덱스에 대한 UNIQUE
인덱스 옵션을 지정합니다. 인덱스 옵션에 대한 자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하세요.
PAD_INDEX = { ON | OFF }
인덱스 패딩을 지정합니다. 기본값은 OFF
입니다.
FILLFACTOR = fillfactor
인덱스를 만들거나 변경하는 동안 데이터베이스 엔진에서 각 인덱스 페이지의 리프 수준을 얼마나 채워야 하는지를 나타내는 백분율을 지정합니다. fillfactor 는 1에서 100까지의 정수 값이어야 합니다. 기본값은 0입니다.
IGNORE_DUP_KEY = { ON | OFF }
삽입 작업에서 고유 인덱스에 중복된 키 값을 삽입하려는 경우에 대한 오류 응답을 지정합니다.
IGNORE_DUP_KEY
옵션은 인덱스를 만들거나 다시 빌드한 후의 삽입 작업에만 적용됩니다. 기본값은 OFF
입니다.
STATISTICS_NORECOMPUTE = { ON | OFF }
분포 통계량을 다시 계산할지 여부를 지정합니다. 기본값은 OFF
입니다.
ALLOW_ROW_LOCKS = { 켜기 | 끄기 }
행 잠금이 허용되는지 여부를 지정합니다. 기본값은 ON
입니다.
ALLOW_PAGE_LOCKS = { ON | OFF }
페이지 잠금이 허용되는지 여부를 지정합니다. 기본값은 ON
입니다.
모범 사례
사용자 정의 함수가 절로 SCHEMABINDING
생성되지 않은 경우 기본 개체에 대한 변경 사항은 함수의 정의에 영향을 미치고 호출 시 예기치 않은 결과를 생성할 수 있습니다. 기본 개체에 대한 변경으로 인해 함수가 최신 상태를 유지하지 못하게 되는 일이 발생하지 않도록 다음 메서드 중 하나를 구현하는 것이 좋습니다.
WITH SCHEMABINDING
함수를 만들 때 절을 지정합니다. 이 옵션은 함수 정의에서 참조되는 개체를 함수도 수정하지 않는 한 수정할 수 없도록 합니다.sp_refreshsqlmodule 저장 프로시저는 함수의 정의에 지정된 개체를 수정한 후 실행합니다.
인라인 테이블 반환 함수(인라인 TVF) 및 다중 문 테이블 반환 함수(MSTVF)에 대한 자세한 내용 및 성능 고려 사항은 사용자 정의 함수 만들기(데이터베이스 엔진)를 참조하세요.
데이터 형식
CLR 함수에 매개 변수를 지정하는 경우 scalar_parameter_data_type에 대해 이전에 정의된 SQL Server 형식이어야 합니다. SQL Server 시스템 데이터 형식을 CLR 통합 데이터 형식 또는 .NET Framework 공용 언어 런타임 데이터 형식과 비교하는 방법에 대한 자세한 내용은 CLR 매개 변수 데이터 매핑을 참조하십시오.
SQL Server가 클래스에서 오버로드될 때 올바른 메서드를 참조하려면 에 표시된 메서드에 다음과 같은 특징이 있어야 합니다.<method_specifier>
- 에 지정된 것과 동일한 수의 매개 변수를 수신합니다.
[ , ...n ]
- 모든 매개 변수를 참조가 아닌 값으로 받습니다.
- SQL Server 함수에 지정된 형식과 호환되는 매개 변수 형식을 사용합니다.
CLR 함수의 반환 데이터 형식이 테이블 형식()RETURNS TABLE
을 지정하는 경우 에 있는 <method_specifier>
메서드의 반환 데이터 형식은 또는 IEnumerator
형식이어야 IEnumerable
하며 인터페이스가 함수 작성자에 의해 구현된 것으로 가정합니다. Transact-SQL 함수와 달리 CLR 함수는 에 PRIMARY KEY
, UNIQUE
또는 CHECK
제약 조건을 포함할 <table_type_definition>
수 없습니다. 에 <table_type_definition>
지정된 열의 데이터 형식은 실행 시 메서드 <method_specifier>
에서 반환된 결과 집합의 해당 열 형식과 일치해야 합니다. 이 형식 검사는 함수가 생성될 때 수행되지 않습니다.
CLR 함수를 프로그래밍하는 방법에 대한 자세한 내용은 CLR User-Defined 함수를 참조하십시오.
비고
스칼라 함수는 스칼라 표현식이 사용되는 곳에서 호출할 수 있으며, 여기에는 계산 열과 CHECK
제약 조건 정의가 포함됩니다. 스칼라 함수는 EXECUTE(Transact-SQL) 문을 사용하여 실행할 수도 있습니다. 스칼라 함수는 적어도 두 부분으로 구성된 함수()<schema>.<function>
의 이름을 사용하여 호출해야 합니다. 다중 부분 이름에 대한 자세한 내용은 Transact-SQL Syntax Conventions (Transact-SQL)를 참조하십시오. 테이블 반환 함수는 테이블 표현식이 , FROM
, SELECT
또는 INSERT
명령문의 UPDATE
절에서 DELETE
허용되는 경우 호출할 수 있습니다. 자세한 내용은 사용자 정의 함수 실행을 참조하세요.
상호 운용성
다음 명령문은 함수에서 유효합니다.
- 대입문.
- Control-of-Flow 문을 제외한
TRY...CATCH
문. -
DECLARE
지역 데이터 변수와 지역 커서를 정의하는 명령문. -
SELECT
지역 변수에 값을 할당하는 표현식이 있는 SELECT 목록을 포함하는 문입니다. - Cursor operations: 함수에서 선언되고, 열리고, 닫히고, 할당 취소된 로컬 커서를 참조합니다. 절을 사용하여
FETCH
지역 변수에 값을 할당하는 문만INTO
허용FETCH
되며 클라이언트에 데이터를 반환하는 문은 허용되지 않습니다. -
INSERT
,UPDATE
, 및DELETE
로컬 테이블 변수를 수정하는 문. -
EXECUTE
확장 저장 프로시저를 호출하는 문.
자세한 내용은 사용자 정의 함수 만들기(데이터베이스 엔진)를 참조하세요.
계산 열 상호 운용성
함수에는 다음과 같은 속성이 있습니다. 이러한 속성의 값은 지속되거나 인덱싱될 수 있는 계산 열에서 함수를 사용할 수 있는지 여부를 결정합니다.
재산 | 설명 | 비고 |
---|---|---|
IsDeterministic |
함수는 결정론적 또는 비결정론적입니다. | 로컬 데이터 액세스는 결정적 함수에서 허용됩니다. 예를 들어, 특정 입력 값 집합을 사용하여 호출될 때마다 항상 동일한 결과를 반환하고 데이터베이스의 동일한 상태를 가진 함수는 결정론적이라는 레이블이 지정됩니다. |
IsPrecise |
기능이 정확하거나 부정확합니다. | 부정확한 함수에는 부동 소수점 연산과 같은 연산이 포함됩니다. |
IsSystemVerified |
함수의 정밀도 및 결정성 속성은 SQL Server에서 확인할 수 있습니다. | |
SystemDataAccess |
함수는 SQL Server의 로컬 인스턴스에 있는 시스템 데이터(시스템 카탈로그 또는 가상 시스템 테이블)에 액세스합니다. | |
UserDataAccess |
함수는 SQL Server의 로컬 인스턴스에 있는 사용자 데이터에 액세스합니다. | 사용자 정의 테이블과 임시 테이블은 포함하지만 테이블 변수는 포함하지 않습니다. |
Transact-SQL 함수의 정밀도 및 결정성 속성은 SQL Server에 의해 자동으로 결정됩니다. CLR 함수의 데이터 액세스 및 결정성 속성은 사용자가 지정할 수 있습니다. 자세한 정보는 CLR 통합: CLR 루틴에 대한 사용자 정의 속성의 내용을 참조하십시오.
이러한 속성의 현재 값을 표시하려면 OBJECTPROPERTYEX(Transact-SQL)를 사용합니다.
중요합니다
함수는 결정론적이려면 를 SCHEMABINDING
사용하여 생성해야 합니다.
사용자 정의 함수(user-defined function)를 호출하는 계산 열은 사용자 정의 함수(user-defined function)가 다음과 같은 속성 값을 가질 때 인덱스에서 사용할 수 있습니다.
-
IsDeterministic
가true
인 경우 -
IsSystemVerified
istrue
(계산 열이 유지되지 않는 경우) -
UserDataAccess
가false
인 경우 -
SystemDataAccess
가false
인 경우
자세한 내용은 계산된 열의 인덱스를 참조하세요.
함수에서 확장 저장 프로시저 호출
확장 저장 프로시저는 함수 내에서 호출할 때 결과 집합을 클라이언트에 반환할 수 없습니다. 결과 집합을 클라이언트에 반환하는 모든 ODS API는 를 반환합니다 FAIL
. 확장 저장 프로시저는 SQL Server 인스턴스에 다시 연결할 수 있습니다. 그러나 확장 저장 프로시저를 호출한 함수와 동일한 트랜잭션에 조인하려고 시도해서는 안 됩니다.
일괄 처리 또는 저장 프로시저의 호출과 마찬가지로 확장 저장 프로시저는 SQL Server가 실행 중인 Windows 보안 계정의 컨텍스트에서 실행됩니다. 저장 프로시저의 소유자는 사용자에게 저장 프로시저에 대한 사용 권한을 부여 EXECUTE
할 때 이 시나리오를 고려해야 합니다.
제한점
사용자 정의 함수는 데이터베이스 상태 수정 동작을 수행하는 데 사용할 수 없습니다.
사용자 정의 함수에는 테이블이 대상인 OUTPUT INTO
절을 포함할 수 없습니다.
다음 Service Broker 문은 Transact-SQL 사용자 정의 함수의 정의에 포함될 수 없습니다.
BEGIN DIALOG CONVERSATION
END CONVERSATION
GET CONVERSATION GROUP
MOVE CONVERSATION
RECEIVE
SEND
사용자 정의 함수는 중첩될 수 있습니다. 즉, 한 사용자 정의 함수가 다른 함수를 호출할 수 있습니다. 호출된 함수가 실행을 시작할 때 중첩 수준이 증가하며 호출된 함수가 실행을 완료하면 감소합니다. 사용자 정의 함수는 최대 32개 수준까지 중첩할 수 있습니다. 최대 중첩 수준을 초과하면 전체 호출 함수 체인이 실패합니다. Transact-SQL 사용자 정의 함수의 관리 코드에 대한 참조는 32 수준 중첩 제한에 대해 한 수준으로 계산됩니다. 관리 코드 내에서 호출된 메서드는 이 제한에 따라 계산되지 않습니다.
CLR 테이블 반환 함수에서 정렬 순서 사용
CLR 테이블 반환 함수에서 절을 사용하는 ORDER
경우 다음 지침을 따르십시오.
결과가 항상 지정된 순서로 정렬되도록 해야 합니다. 결과가 지정된 순서가 아닌 경우 SQL Server는 쿼리가 실행될 때 오류 메시지를 생성합니다.
ORDER
절을 지정하는 경우 테이블 반환 함수의 출력은 열의 데이터 정렬(명시적 또는 암시적)에 따라 정렬되어야 합니다. 예를 들어 열 데이터 정렬이 중국어인 경우 반환된 결과는 중국어 정렬 규칙에 따라 정렬되어야 합니다. (데이터 정렬은 테이블 반환 함수에 대한 DDL에 지정되거나 데이터베이스 데이터 정렬에서 가져옵니다.)SQL Server는 쿼리 프로세서가
ORDER
추가 최적화를 수행하기 위해 이 절을 사용하는지 여부에 관계없이 결과를 반환하는 동안 지정된 경우 항상 절을 확인합니다. 쿼리 프로세서에 유용하다는 것을 알고 있는 경우에만 절을 사용합니다ORDER
.SQL Server 쿼리 프로세서는 다음과 같은 경우에 이
ORDER
절을 자동으로 활용합니다.- 절이
ORDER
인덱스와 호환되는 위치에 쿼리를 삽입합니다. -
ORDER BY
절과 호환되는 절입니다ORDER
. - Aggregates, where
GROUP BY
는 clause와ORDER
호환됩니다. -
DISTINCT
distinct columns가 clause와ORDER
호환되는 aggregates.
- 절이
이 절은 ORDER
쿼리에 지정되지 않는 한 SELECT
쿼리가 ORDER BY
실행될 때 정렬된 결과를 보장하지 않습니다. 테이블 반환 함수의 정렬 순서에 포함된 열을 쿼리하는 방법에 대한 자세한 내용은 sys.function_order_columns(Transact-SQL) 를 참조하십시오.
메타데이터
다음 표에는 사용자 정의 함수에 대한 메타데이터를 반환하는 데 사용할 수 있는 시스템 카탈로그 뷰가 나열되어 있습니다.
시스템 보기 | 설명 |
---|---|
sys.sql_모듈 | 예제 섹션에서 예제 E를 참조하십시오. |
sys.assembly_modules | CLR 사용자 정의 함수에 대한 정보를 표시합니다. |
sys.parameters | 사용자 정의 함수(UDF)에 정의된 매개 변수에 대한 정보를 표시합니다. |
sys.sql_expression_dependencies | 함수에서 참조하는 기본 개체를 표시합니다. |
권한
데이터베이스에 대한 CREATE FUNCTION
권한과 함수가 생성되는 스키마에 대한 ALTER
권한이 필요합니다. 함수가 사용자 정의 형식을 지정하면 해당 유형에 대한 EXECUTE
권한이 필요합니다.
예시
UDF에 대한 추가 예제 및 성능 고려 사항은 사용자 정의 함수 만들기(데이터베이스 엔진)를 참조하세요.
A. ISO 주를 계산하는 스칼라 값 사용자 정의 함수를 사용합니다.
다음 예제에서는 사용자 정의 함수 ISOweek
를 만듭니다. 이 함수는 날짜 인수를 사용하고 ISO 주 번호를 계산합니다. 이 함수가 올바르게 SET DATEFIRST 1
계산되려면 함수가 호출되기 전에 호출되어야 합니다.
또한 EXECUTE AS 절(Transact-SQL) 절을 사용하여 저장 프로시저를 실행할 수 있는 보안 컨텍스트를 지정하는 방법을 보여 줍니다. 이 예제에서 옵션은 CALLER
프로시저가 호출하는 사용자의 컨텍스트에서 실행되도록 지정합니다. 지정할 수 있는 다른 옵션은 , SELF
, OWNER
입니다.
다음은 함수 호출입니다.
DATEFIRST
이 1
로 설정됩니다.
CREATE FUNCTION dbo.ISOweek (@DATE DATETIME)
RETURNS INT
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @ISOweek INT;
SET @ISOweek = DATEPART(wk, @DATE) + 1 -
DATEPART(wk, CAST(DATEPART(yy, @DATE) AS CHAR(4)) + '0104');
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek = 0)
SET @ISOweek = dbo.ISOweek(CAST(DATEPART(yy, @DATE) - 1 AS CHAR(4))
+ '12' + CAST(24 + DATEPART(DAY, @DATE) AS CHAR(2))) + 1;
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm, @DATE) = 12)
AND ((DATEPART(dd, @DATE) - DATEPART(dw, @DATE)) >= 28))
SET @ISOweek = 1;
RETURN (@ISOweek);
END;
GO
SET DATEFIRST 1;
SELECT dbo.ISOweek(CONVERT(DATETIME, '12/26/2004', 101)) AS 'ISO Week';
결과 집합은 다음과 같습니다.
ISO Week
----------------
52
B. 인라인 테이블 반환 함수 만들기
다음 예에서는 AdventureWorks2022 데이터베이스에서 인라인 테이블 반환 함수를 반환합니다. 세 개의 열 ProductID
, Name
, 그리고 매장에 판매된 각 제품에 대한 YTD Total
매장별 연간 합계의 집계를 반환합니다.
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid INT)
RETURNS TABLE
AS
RETURN (
SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
FROM Production.Product AS P
INNER JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
INNER JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
INNER JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);
GO
함수를 호출하려면 이 쿼리를 실행합니다.
SELECT * FROM Sales.ufn_SalesByStore (602);
C. 다중 문 테이블 반환 함수 만들기
다음 예에서는 데이터베이스에 테이블 반환 함수를 ufn_FindReports(InEmpID)
AdventureWorks2022
만듭니다. 유효한 직원 ID와 함께 제공되면 함수는 직원에게 직접 또는 간접적으로 보고하는 모든 직원에 해당하는 테이블을 반환합니다. 이 함수는 재귀 CTE(Common Table Expression)를 사용하여 계층적 직원 목록을 생성합니다. 재귀 CTE에 대한 자세한 내용은 WITH common_table_expression(Transact-SQL)를 참조하세요.
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INT)
RETURNS @retFindReports TABLE (
EmployeeID INT PRIMARY KEY NOT NULL,
FirstName NVARCHAR(255) NOT NULL,
LastName NVARCHAR(255) NOT NULL,
JobTitle NVARCHAR(50) NOT NULL,
RecursionLevel INT NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.
AS
BEGIN
WITH EMP_cte (
EmployeeID,
OrganizationNode,
FirstName,
LastName,
JobTitle,
RecursionLevel
) -- CTE name and columns
AS (
-- Get the initial list of Employees for Manager n
SELECT e.BusinessEntityID,
OrganizationNode = ISNULL(e.OrganizationNode, CAST('/' AS HIERARCHYID)),
p.FirstName,
p.LastName,
e.JobTitle,
0
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @InEmpID
UNION ALL
-- Join recursive member to anchor
SELECT e.BusinessEntityID,
e.OrganizationNode,
p.FirstName,
p.LastName,
e.JobTitle,
RecursionLevel + 1
FROM HumanResources.Employee e
INNER JOIN EMP_cte
ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
)
-- Copy the required columns to the result of the function
INSERT @retFindReports
SELECT EmployeeID,
FirstName,
LastName,
JobTitle,
RecursionLevel
FROM EMP_cte
RETURN
END;
GO
-- Example invocation
SELECT EmployeeID,
FirstName,
LastName,
JobTitle,
RecursionLevel
FROM dbo.ufn_FindReports(1);
GO
D. CLR 함수 만들기
이 예제에서는 CLR 함수를 len_s
만듭니다. 함수를 만들기 전에 어셈블리 SurrogateStringFunction.dll
가 로컬 데이터베이스에 등록됩니다.
적용 대상: SQL Server 2008(10.0.x) SP 1 이상 버전.
DECLARE @SamplesPath NVARCHAR(1024);
-- You may have to modify the value of this variable if you have
-- installed the sample in a ___location other than the default ___location.
SELECT @SamplesPath = REPLACE(physical_name,
'Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\master.mdf',
'Microsoft SQL Server\130\Samples\Engine\Programmability\CLR\'
)
FROM master.sys.database_files
WHERE name = 'master';
CREATE ASSEMBLY [SurrogateStringFunction]
FROM @SamplesPath + 'StringManipulate\CS\StringManipulate\bin\debug\SurrogateStringFunction.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO
CREATE FUNCTION [dbo].[len_s] (@str NVARCHAR(4000))
RETURNS BIGINT
AS
EXTERNAL NAME [SurrogateStringFunction].[Microsoft.Samples.SqlServer.SurrogateStringFunction].[LenS];
GO
CLR 테이블 반환 함수를 만드는 방법에 대한 예제는 CLR Table-Valued 함수를 참조하십시오.
E. 사용자 정의 함수의 정의를 표시합니다
SELECT DEFINITION,
type
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
ON m.object_id = o.object_id
AND type IN ('FN', 'IF', 'TF');
GO
이 ENCRYPTION
옵션을 사용하여 만든 함수의 정의는 를 사용하여 sys.sql_modules
볼 수 없지만 암호화된 함수에 대한 다른 정보는 표시됩니다.