CREATE FUNCTION (Transact-SQL)CREATE FUNCTION (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Создает определяемую пользователем функцию в SQL ServerSQL Server и База данных SQL AzureAzure SQL Database.Creates a user-defined function in SQL ServerSQL Server and База данных SQL AzureAzure SQL Database. Определяемая пользователем функция представляет собой подпрограмму Transact-SQLTransact-SQL или среды CLR, которая принимает параметры, выполняет действия, такие как сложные вычисления, а затем возвращает результат этих действий в виде значения.A user-defined function is a Transact-SQLTransact-SQL or common language runtime (CLR) routine that accepts parameters, performs an action, such as a complex calculation, and returns the result of that action as a value. Возвращаемое значение может быть скалярным значением или таблицей.The return value can either be a scalar (single) value or a table. При помощи этой инструкции можно создать подпрограмму, которую можно повторно использовать следующими способами.Use this statement to create a reusable routine that can be used in these ways:

  • В инструкциях Transact-SQLTransact-SQL, например SELECT.In Transact-SQLTransact-SQL statements such as SELECT

  • В приложениях, вызывающих функцию.In applications calling the function

  • В определении другой пользовательской функции.In the definition of another user-defined function

  • Для параметризации представления или улучшения функциональности индексированного представления.To parameterize a view or improve the functionality of an indexed view

  • Для определения столбца таблицы.To define a column in a table

  • Для определения ограничения CHECK на столбец.To define a CHECK constraint on a column

  • Для замены хранимой процедуры.To replace a stored procedure

  • Использование встроенной функции в качестве предиката фильтра для политики безопасностиUse an inline function as a filter predicate for a security policy

Примечание

В этом разделе рассматривается интеграция среды CLR .NET Framework с SQL ServerSQL Server.The integration of .NET Framework CLR into SQL ServerSQL Server is discussed in this topic. Интеграция со средой CLR не применяется к База данных SQL AzureAzure SQL Database.CLR integration does not apply to База данных SQL AzureAzure SQL Database.

Примечание

Для сведений о Хранилище данных SQLSQL Data Warehouse см. раздел CREATE FUNCTION (хранилище данных SQL).For Хранилище данных SQLSQL Data Warehouse, see CREATE FUNCTION (SQL Data Warehouse).

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- Transact-SQL Scalar Function Syntax  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  
-- Transact-SQL Inline Table-Valued Function Syntax   
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS TABLE  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    RETURN [ ( ] select_stmt [ ) ]  
[ ; ]  
  
-- Transact-SQL Multi-Statement Table-Valued Function Syntax  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [READONLY] }   
    [ ,...n ]  
  ]  
)  
RETURNS @return_variable TABLE <table_type_definition>  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN  
    END  
[ ; ]  
  
-- Transact-SQL Function Clauses   
<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 Scalar Function Syntax  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
)  
RETURNS { return_data_type }  
    [ WITH <clr_function_option> [ ,...n ] ]  
    [ AS ] EXTERNAL NAME <method_specifier>  
[ ; ]  
-- CLR Table-Valued Function Syntax  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
)  
RETURNS TABLE <clr_table_type_definition>   
    [ WITH <clr_function_option> [ ,...n ] ]  
    [ ORDER ( <order_clause> ) ]  
    [ AS ] EXTERNAL NAME <method_specifier>  
[ ; ]  
-- CLR Function Clauses  
<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 ] )  
  
-- In-Memory OLTP: Syntax for natively compiled, scalar user-defined function  
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 ]   
}  
  

АргументыArguments

OR ALTEROR ALTER
Область применения: SQL ServerSQL ServerSQL Server 2016 (13.x)SQL Server 2016 (13.x) с пакетом обновления 1 (SP1) по SQL ServerSQL Server) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 through SQL ServerSQL Server) and База данных SQL AzureAzure SQL Database

Условно изменяет функцию только в том случае, если она уже существует.Conditionally alters the function only if it already exists.

Примечание

Необязательный синтаксис [OR ALTER] для среды CLR доступен, начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) с пакетом обновления 1 (SP1) с накопительным пакетом обновления 1 (CU1).Optional [OR ALTER] syntax for CLR is available starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU1.

schema_nameschema_name
Имя схемы, к которой принадлежит определяемая пользователем функция.Is the name of the schema to which the user-defined function belongs.

function_namefunction_name
Имя определяемой пользователем функции.Is the name of the user-defined function. Имена функций должны удовлетворять правилам построения идентификаторов и быть уникальными в пределах базы данных и схемы.Function names must comply with the rules for identifiers and must be unique within the database and to its schema.

Примечание

Даже при отсутствии аргументов скобки после имени функции обязательны.Parentheses are required after the function name even if a parameter is not specified.

@parameter_name@parameter_name
Аргумент пользовательской функции.Is a parameter in the user-defined function. Может быть объявлен один или несколько аргументов.One or more parameters can be declared.

Для функций допускается не более 2 100 параметров.A function can have a maximum of 2,100 parameters. При выполнении функции значение каждого из объявленных параметров должно быть указано пользователем, если для них не определены значения по умолчанию.The value of each declared parameter must be supplied by the user when the function is executed, unless a default for the parameter is defined.

Определяет имя параметра, используя знак @ как первый символ.Specify a parameter name by using an at sign (@) as the first character. Имя параметра должно соответствовать правилам для идентификаторов.The parameter name must comply with the rules for identifiers. Параметры являются локальными в пределах функции, в разных функциях могут быть использованы одинаковые имена параметров.Parameters are local to the function; the same parameter names can be used in other functions. Аргументы могут использоваться только вместо констант. Они не могут использоваться вместо имен таблиц, имен столбцов или имен других объектов базы данных.Parameters can take the place only of constants; they cannot be used instead of table names, column names, or the names of other database objects.

Примечание

Параметры ANSI_WARNINGS не годятся для передачи в хранимые процедуры, пользовательские функции и при объявлении и установке переменных в пакетных инструкциях.ANSI_WARNINGS is not honored when you pass parameters in a stored procedure, user-defined function, or when you declare and set variables in a batch statement. Например, если объявить переменную как char(3) , а затем присвоить ей значение длиннее трех символов, данные будут усечены до размера переменной, а инструкция INSERT или UPDATE завершится без ошибок.For example, if a variable is defined as char(3), and then set to a value larger than three characters, the data is truncated to the defined size and the INSERT or UPDATE statement succeeds.

[ type_schema_name.[ type_schema_name. ] parameter_data_type] parameter_data_type
Тип данных параметра (возможно, с указанием схемы, которой он принадлежит).Is the parameter data type, and optionally the schema to which it belongs. Для функций Transact-SQLTransact-SQL допустимы любые типы данных, включая определяемые пользователем типы данных CLR и определяемые пользователем табличные типы, за исключением типа данных timestamp.For Transact-SQLTransact-SQL functions, all data types, including CLR user-defined types and user-defined table types, are allowed except the timestamp data type. Для функций CLR допустимы все типы данных, включая определяемые пользователем типы данных CLR, за исключением типов данных text, ntext, image, определяемых пользователем табличных типов и типов данных timestamp.For CLR functions, all data types, including CLR user-defined types, are allowed except text, ntext, image, user-defined table types and timestamp data types. Нескалярные типы cursor и table не могут быть указаны в качестве типов данных параметров ни для функций Transact-SQLTransact-SQL, ни для функций CLR.The nonscalar types, cursor and table, cannot be specified as a parameter data type in either Transact-SQLTransact-SQL or CLR functions.

Если type_schema_name не указан, Компонент Database EngineDatabase Engine выполняет поиск scalar_parameter_data_type в следующем порядке:If type_schema_name is not specified, the Компонент Database EngineDatabase Engine looks for the scalar_parameter_data_type in the following order:

  • в схеме, содержащей имена системных типов данных SQL ServerSQL Server;The schema that contains the names of SQL ServerSQL Server system data types.
  • в установленной по умолчанию для текущего пользователя схеме в текущей базе данных;The default schema of the current user in the current database.
  • Схема dbo в текущей базе данных.The dbo schema in the current database.

[ =default ][ =default ]
Значение по умолчанию для аргумента.Is a default value for the parameter. Если определено значение default, то функция выполняется даже в том случае, если для данного параметра значение не указано.If a default value is defined, the function can be executed without specifying a value for that parameter.

Примечание

Для функций CLR также могут указываться значения параметров по умолчанию, кроме типов данных varchar(max) и varbinary(max) .Default parameter values can be specified for CLR functions except for the varchar(max) and varbinary(max) data types.

Если параметр функции имеет значение по умолчанию, то для него должно быть указано ключевое слово DEFAULT для получения функцией значения по умолчанию.When a parameter of the function has a default value, the keyword DEFAULT must be specified when the function is called to retrieve the default value. Применение ключевого слова DEFAULT следует отличать от использования аргументов со значениями по умолчанию в хранимых процедурах, когда не указанный аргумент неявно принимает значение по умолчанию.This behavior is different from using parameters with default values in stored procedures in which omitting the parameter also implies the default value. Однако ключевое слово DEFAULT не требуется при вызове скалярной функции с помощью инструкции EXECUTE.However, the DEFAULT keyword is not required when invoking a scalar function by using the EXECUTE statement.

READONLYREADONLY
Указывает, что параметр не может быть обновлен или изменен при определении функции.Indicates that the parameter cannot be updated or modified within the definition of the function. Если тип параметра является определяемым пользователем табличным типом, то должно быть указано ключевое слово READONLY.If the parameter type is a user-defined table type, READONLY should be specified.

return_data_typereturn_data_type
Возвращаемое значение скалярной пользовательской функции.Is the return value of a scalar user-defined function. Для функций Transact-SQLTransact-SQL допустимы любые типы данных, включая определяемые пользователем типы данных CLR, кроме типа данных timestamp.For Transact-SQLTransact-SQL functions, all data types, including CLR user-defined types, are allowed except the timestamp data type. Для функций CLR допустимы любые типы данных, включая определяемые пользователем типы данных CLR, кроме типов данных text, ntext, image и timestamp.For CLR functions, all data types, including CLR user-defined types, are allowed except the text, ntext, image, and timestamp data types. Нескалярные типы cursor и table не могут быть указаны в качестве возвращаемых типов данных ни для функций Transact-SQLTransact-SQL, ни для функций CLR.The nonscalar types, cursor and table, cannot be specified as a return data type in either Transact-SQLTransact-SQL or CLR functions.

function_bodyfunction_body
Указывает серию инструкций Transact-SQLTransact-SQL, совместная работа которых не вызывает побочных эффектов, например изменения содержимого таблиц, и формирует значение функции.Specifies that a series of Transact-SQLTransact-SQL statements, which together do not produce a side effect such as modifying a table, define the value of the function. function_body используется только в скалярных функциях и функциях с табличным значением из нескольких инструкций (MSTVF).function_body is used only in scalar functions and multi-statement table-valued functions (MSTVFs).

Для скалярных функций function_body представляет собой ряд инструкций Transact-SQLTransact-SQL, которые в совокупности вычисляют скалярное выражение.In scalar functions, function_body is a series of Transact-SQLTransact-SQL statements that together evaluate to a scalar value.

Для функций с табличным значением из нескольких инструкций function_body является рядом инструкций Transact-SQLTransact-SQL, заполняющих возвращаемую переменную TABLE.In MSTVFs, function_body is a series of Transact-SQLTransact-SQL statements that populate a TABLE return variable.

scalar_expressionscalar_expression
Указывает скалярное значение, возвращаемое скалярной функцией.Specifies the scalar value that the scalar function returns.

TABLETABLE
Указывает, что возвращаемым значением функции с табличным значением (TVF) является таблица.Specifies that the return value of the table-valued function (TVF) is a table. Функциям с табличным значением могут передаваться только константы и @local_variables.Only constants and @local_variables can be passed to TVFs.

Во встроенных функциях с табличным значением возвращаемое значение TABLE определяется при использовании единственной инструкции SELECT.In inline TVFs, the TABLE return value is defined through a single SELECT statement. Встроенные функции не имеют соответствующих возвращаемых переменных.Inline functions do not have associated return variables.

В функциях с табличным значением из нескольких инструкций переменной @return_variable является переменная TABLE, используемая для сохранения данных и накопления строк, которые будут возвращены в качестве значения функции.In MSTVFs, @return_variable is a TABLE variable, used to store and accumulate the rows that should be returned as the value of the function. Аргумент @return_variable может быть указан только для функций Transact-SQLTransact-SQL, но не для функций CLR.@return_variable can be specified only for Transact-SQLTransact-SQL functions and not for CLR functions.

select_stmtselect_stmt
Единственная инструкция SELECT, которая определяет возвращаемое значение встроенной функции, возвращающей табличное значение (TVF).Is the single SELECT statement that defines the return value of an inline table-valued function (TVF).

ORDER (<order_clause>) Указывает порядок, в котором возвращаются результаты из функции с табличным значением.ORDER (<order_clause>) Specifies the order in which results are being returned from the table-valued function. Дополнительные сведения см. в разделе Использование порядка сортировки в функциях с табличным значением CLR далее в этом разделе.For more information, see the section, "Using Sort Order in CLR Table-valued Functions", later in this topic.

EXTERNAL NAME <method_specifier> assembly_name.class_name.method_name EXTERNAL NAME <method_specifier> assembly_name.class_name.method_name
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 с пакетом обновления 1 (SP1) по SQL ServerSQL Server)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 SP1 through SQL ServerSQL Server)

Указывает сборку и метод, на которые должно ссылаться имя создаваемой функции.Specifies the assembly and method to which the created function name shall refer.

  • assembly_name — должно соответствовать значению в столбце name инструкцииassembly_name - must match a value in the name column of
    SELECT * FROM sys.assemblies;.SELECT * FROM sys.assemblies;.
    Это имя, которое использовалось в инструкции CREATE ASSEMBLY.This is the name that was used on the CREATE ASSEMBLY statement.

  • class_name — должно соответствовать значению в столбце assembly_name инструкцииclass_name - must match a value in the assembly_name column of
    SELECT * FROM sys.assembly_modules;.SELECT * FROM sys.assembly_modules;.
    Часто это значение содержит точку или пунктир.Often the value contains an embedded period or dot. В таких случаях согласно требованиям синтаксиса Transact-SQL значение должно заключаться в квадратные скобки [] или в двойные кавычки "".In such cases the Transact-SQL syntax requires that the value be bounded with a pair of straight brackets [], or with a pair of double quotation marks "".

  • method_name — должно соответствовать значению в столбце method_name инструкцииmethod_name - must match a value in the method_name column of
    SELECT * FROM sys.assembly_modules;.SELECT * FROM sys.assembly_modules;.
    Метод должен быть статическим.The method must be static.

В типичном примере для библиотеки MyFood.DLL, в которой все типы находятся в пространстве имен MyFood, значение EXTERNAL NAME может быть следующим:In a typical example, for MyFood.DLL, in which all types are in the MyFood namespace, the EXTERNAL NAME value could be:
MyFood.[MyFood.MyClass].MyStaticMethod

Примечание

По умолчанию SQL ServerSQL Server не производит выполнение кода CLR.By default, SQL ServerSQL Server cannot execute CLR code. Можно создавать, изменять и удалять объекты базы данных со ссылками на модули среды CLR, но SQL ServerSQL Server не выполняет их до тех пор, пока не будет включен параметр clr enabled.You can create, modify, and drop database objects that reference common language runtime modules; however, you cannot execute these references in SQL ServerSQL Server until you enable the clr enabled option. Для его включения воспользуйтесь хранимой процедурой sp_configure.To enable this option, use sp_configure.

Примечание

Этот параметр недоступен в автономной базе данных.This option is not available in a contained database.

< table_type_definition > ( { <column_definition> <column_constraint> | <computed_column_definition> } [ <table_constraint> ] [ ,...n ] ) Определяет тип данных таблицы для функции Transact-SQLTransact-SQL.< table_type_definition*>* ( { <column_definition> <column_constraint> | <computed_column_definition> } [ <table_constraint> ] [ ,...n ] ) Defines the table data type for a Transact-SQLTransact-SQL function. Объявление таблицы включает определения столбцов, а также ограничений для столбцов и таблиц.The table declaration includes column definitions and column or table constraints. Таблица всегда помещается в первичную файловую группу.The table is always put in the primary filegroup.

< clr_table_type_definition > ( { column_name**data_type } [ ,...n ] )< clr_table_type_definition > ( { column_name**data_type } [ ,...n ] )
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 с пакетом обновления 1 (SP1) по SQL ServerSQL Server), База данных SQL AzureAzure SQL Database (предварительная версия в некоторых регионах).Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 SP1 through SQL ServerSQL Server) and База данных SQL AzureAzure SQL Database (Preview in some regions).

Определяет табличные типы данных для функции CLR.Defines the table data types for a CLR function. Объявление таблицы включает только имена столбцов и типы данных.The table declaration includes only column names and data types. Таблица всегда помещается в первичную файловую группу.The table is always put in the primary filegroup.

NULL|NOT NULLNULL|NOT NULL
Поддерживается только для скомпилированных в собственном коде скалярных определяемых пользователем функций.Supported only for natively compiled, scalar user-defined functions. Дополнительные сведения см. в разделе Скалярные определяемые пользователем функции для выполняющейся в памяти OLTP.For more information, see Scalar User-Defined Functions for In-Memory OLTP.

NATIVE_COMPILATIONNATIVE_COMPILATION
Указывает, скомпилирована ли в собственном коде определяемая пользователем функция.Indicates whether a user-defined function is natively compiled. Этот аргумент требуется только для скомпилированных в собственном коде скалярных определяемых пользователем функций.This argument is required for natively compiled, scalar user-defined functions.

BEGIN ATOMIC WITHBEGIN ATOMIC WITH
Поддерживается только для скомпилированных в собственном коде скалярных определяемых пользователем функций и является обязательным.Supported only for natively compiled, scalar user-defined functions, and is required. Дополнительные сведения см. в статье Atomic Blocks.For more information, see Atomic Blocks.

SCHEMABINDINGSCHEMABINDING
Аргумент SCHEMABINDING требуется для скомпилированных в собственном коде скалярных определяемых пользователем функций.The SCHEMABINDING argument is required for natively compiled, scalar user-defined functions.

EXECUTE ASEXECUTE AS
Аргумент EXECUTE AS требуется для скомпилированных в собственном коде скалярных определяемых пользователем функций.EXECUTE AS is required for natively compiled, scalar user-defined functions.

<function_option>::= and <clr_function_option>::=<function_option>::= and <clr_function_option>::=

Указывает, что функция будет иметь один или несколько из следующих параметров.Specifies that the function will have one or more of the following options.

ENCRYPTIONENCRYPTION
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 с пакетом обновления 1 (SP1) по SQL ServerSQL Server)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 SP1 through SQL ServerSQL Server)

Указывает, что компонент Компонент Database EngineDatabase Engine преобразует исходный текст инструкции CREATE FUNCTION в скрытый формат.Indicates that the Компонент Database EngineDatabase Engine will convert the original text of the CREATE FUNCTION statement to an obfuscated format. Выходные данные запутывания не видны непосредственно ни в одном представлении каталога.The output of the obfuscation is not directly visible in any catalog views. Пользователи, не имеющие доступа к системным таблицам или файлам баз данных, не смогут получить скрытый текст.Users that have no access to system tables or database files cannot retrieve the obfuscated text. Однако этот текст будет доступен привилегированным пользователям, которые либо смогут обращаться к системным таблицам через порт DAC, либо будут иметь непосредственный доступ к файлам баз данных.However, the text will be available to privileged users that can either access system tables over the DAC port or directly access database files. Кроме того, пользователи, имеющие право на подключение отладчика к серверному процессу, могут получить исходный текст процедуры из памяти во время выполнения.Also, users that can attach a debugger to the server process can retrieve the original procedure from memory at runtime. Дополнительные сведения о доступе к метаданным системы см. в статье Настройка видимости метаданных.For more information about accessing system metadata, see Metadata Visibility Configuration.

Использование этого параметра препятствует публикации данной функции как части репликации SQL ServerSQL Server.Using this option prevents the function from being published as part of SQL ServerSQL Server replication. Этот параметр для функций CLR указывать нельзя.This option cannot be specified for CLR functions.

SCHEMABINDINGSCHEMABINDING
Указывает, что функция привязана к объектам базы данных, которые содержат ссылки на нее.Specifies that the function is bound to the database objects that it references. Если аргумент SCHEMABINDING указан, нельзя изменить базовые объекты таким способом, который может повлиять на определение функции.When SCHEMABINDING is specified, the base objects cannot be modified in a way that would affect the function definition. Сначала нужно изменить или удалить само определение функции, чтобы удалить зависимости от объекта, который требуется изменить.The function definition itself must first be modified or dropped to remove dependencies on the object that is to be modified.

Привязка функции к ссылающимся на нее объектам удаляется в следующих случаях:The binding of the function to the objects it references is removed only when one of the following actions occurs:

  • При удалении функции.The function is dropped.

  • При изменении функции инструкцией ALTER, если не указан параметр SCHEMABINDING.The function is modified by using the ALTER statement with the SCHEMABINDING option not specified.

Функция может быть привязана к схеме только в том случае, если выполняются следующие условия.A function can be schema bound only if the following conditions are true:

  • Функция является функцией Transact-SQLTransact-SQL.The function is a Transact-SQLTransact-SQL function.

  • Пользовательские функции и представления, на которые ссылается данная функция, также привязаны к схеме.The user-defined functions and views referenced by the function are also schema-bound.

  • Объекты, на которые ссылается функция, указываются двухкомпонентными именами.The objects referenced by the function are referenced using a two-part name.

  • Функция и объекты, на которые она ссылается, относятся к одной и той же базе данных.The function and the objects it references belong to the same database.

  • Пользователь, выполняющий инструкцию CREATE FUNCTION, имеет разрешение REFERENCES на объекты базы данных, на которые ссылается функция.The user who executed the CREATE FUNCTION statement has REFERENCES permission on the database objects that the function references.

RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUTRETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT
Указывает атрибут OnNULLCall скалярной функции.Specifies the OnNULLCall attribute of a scalar function. Если данный аргумент не указан, по умолчанию предполагается CALLED ON NULL INPUT.If not specified, CALLED ON NULL INPUT is implied by default. Это означает, что текст функции выполняется даже в том случае, если в качестве аргумента передано значение NULL.This means that the function body executes even if NULL is passed as an argument.

Если атрибут RETURNS NULL ON NULL INPUT указан для функции CLR, это означает, что SQL ServerSQL Server может вернуть NULL, не вызывая при этом тело функции в том случае, если в качестве какого-либо из аргументов указано значение NULL.If RETURNS NULL ON NULL INPUT is specified in a CLR function, it indicates that SQL ServerSQL Server can return NULL when any of the arguments it receives is NULL, without actually invoking the body of the function. Если метод функции CLR, указанный в <method_specifier>, уже имеет пользовательский атрибут, определяющий RETURNS NULL ON NULL INPUT, но инструкция CREATE FUNCTION определяет CALLED ON NULL INPUT, то инструкция CREATE FUNCTION имеет больший приоритет.If the method of a CLR function specified in <method_specifier> already has a custom attribute that indicates RETURNS NULL ON NULL INPUT, but the CREATE FUNCTION statement indicates CALLED ON NULL INPUT, the CREATE FUNCTION statement takes precedence. Атрибут OnNULLCall не может быть указан для функций CLR с табличным значением.The OnNULLCall attribute cannot be specified for CLR table-valued functions.

Предложение EXECUTE ASEXECUTE AS Clause
Указывает контекст безопасности, в котором выполняется определяемая пользователем функция.Specifies the security context under which the user-defined function is executed. Иными словами, есть возможность управлять тем, какую учетную запись пользователя SQL ServerSQL Server использует при определении разрешений на объекты базы данных, на которые ссылается функция.Therefore, you can control which user account SQL ServerSQL Server uses to validate permissions on any database objects that are referenced by the function.

Примечание

EXECUTE AS недопустимо указывать для встроенных функций с табличным значением.EXECUTE AS cannot be specified for inline table-valued functions.

Дополнительные сведения см. в разделе Предложение EXECUTE AS (Transact-SQL).For more information, see EXECUTE AS Clause (Transact-SQL).

INLINE = { ON | OFF }INLINE = { ON | OFF }
Указывает, должна ли эта скалярная пользовательская функция быть встроенной.Specifies whether this scalar UDF should be inlined or not. Это предложение применяется только к скалярным пользовательским функциям.This clause applies only to scalar user-defined functions. Предложение INLINE не является обязательным.The INLINE clause is not mandatory. Если предложение INLINE не указано, оно автоматически принимает значение ON или OFF в зависимости от возможности встраивания пользовательской функции.If INLINE clause is not specified, it is automatically set to ON/OFF based on whether the UDF is inlineable. Если INLINE=ON указано, но функция не может быть встраиваемой, выдается ошибка.If INLINE=ON is specified but the UDF is found to be non-inlineable, an error will be thrown. Дополнительные сведения: Встраивание скалярной функции, определяемой пользователем.For more information, see Scalar UDF Inlining.

< column_definition >::=< column_definition >::=

Определяет тип данных таблицы.Defines the table data type. Декларация таблицы включает определения столбцов и ограничений.The table declaration includes column definitions and constraints. Для функций CLR можно указать только column_name и data_type.For CLR functions, only column_name and data_type can be specified.

column_namecolumn_name
Имя столбца в таблице.Is the name of a column in the table. Имена столбцов должны соответствовать правилам для идентификаторов и быть уникальными в рамках таблицы.Column names must comply with the rules for identifiers and must be unique in the table. column_name может иметь длину от 1 до 128 символов.column_name can consist of 1 through 128 characters.

data_typedata_type
Указывает тип данных столбца.Specifies the column data type. Для функций Transact-SQLTransact-SQL допустимы любые типы данных, включая определяемые пользователем типы данных CLR, кроме типа данных timestamp.For Transact-SQLTransact-SQL functions, all data types, including CLR user-defined types, are allowed except timestamp. Для функций CLR допустимы любые типы данных, включая определяемые пользователем типы данных CLR, кроме типов данных text, ntext, image, char, varchar, varchar(max) и timestamp. Нескалярный тип данных cursor не может указываться в качестве типа данных столбца ни для функций Transact-SQLTransact-SQL, ни для функций CLR.For CLR functions, all data types, including CLR user-defined types, are allowed except text, ntext, image, char, varchar, varchar(max), and timestamp.The nonscalar type cursor cannot be specified as a column data type in either Transact-SQLTransact-SQL or CLR functions.

DEFAULT constant_expressionDEFAULT constant_expression
Указывает значение, присваиваемое столбцу в случае отсутствия явно заданного значения при вставке.Specifies the value provided for the column when a value is not explicitly supplied during an insert. Выражение constant_expression является константой, значением NULL или значением системной функции.constant_expression is a constant, NULL, or a system function value. Определения DEFAULT могут применяться к любым столбцам, кроме тех, которые имеют свойство IDENTITY.DEFAULT definitions can be applied to any column except those that have the IDENTITY property. Предложение DEFAULT не может быть указано для функций CLR с табличным значением.DEFAULT cannot be specified for CLR table-valued functions.

COLLATE collation_nameCOLLATE collation_name
Задает параметры сортировки для столбца.Specifies the collation for the column. Если не указано, столбцу назначаются параметры сортировки, принятые в базе данных по умолчанию.If not specified, the column is assigned the default collation of the database. Именем параметров сортировки может быть либо имя параметров сортировки Windows, либо имя параметров сортировки SQL.Collation name can be either a Windows collation name or a SQL collation name. Список и дополнительные сведения о параметрах сортировки см. в разделах Имя параметра сортировки Windows (Transact-SQL) и Имя параметра сортировки SQL Server (Transact-SQL).For a list of and more information about collations, see Windows Collation Name (Transact-SQL) and SQL Server Collation Name (Transact-SQL).

Предложение COLLATE может быть использовано для изменения параметров сортировки только для столбцов с типом данных char, varchar, nchar или nvarchar.The COLLATE clause can be used to change the collations only of columns of the char, varchar, nchar, and nvarchar data types.

Примечание

COLLATE недопустимо указывать для функций с табличным значением в среде выполнения.COLLATE cannot be specified for CLR table-valued functions.

ROWGUIDCOLROWGUIDCOL
Показывает, что новый столбец является строковым столбцом идентификаторов GUID.Indicates that the new column is a row globally unique identifier column. Только один столбец типа uniqueidentifier в таблице может быть назначен в качестве столбца ROWGUIDCOL.Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. Свойство ROWGUIDCOL может быть присвоено только столбцу типа uniqueidentifier.The ROWGUIDCOL property can be assigned only to a uniqueidentifier column.

Свойство ROWGUIDCOL не обеспечивает уникальности значений, хранимых в столбце.The ROWGUIDCOL property does not enforce uniqueness of the values stored in the column. Кроме того, данное свойство не производит автоматическое формирование значений для новых строк, вставляемых в таблицу.It also does not automatically generate values for new rows inserted into the table. Для создания уникальных значений произвольного столбца используйте функцию NEWID в инструкции INSERT.To generate unique values for each column, use the NEWID function on INSERT statements. Может быть указано значение по умолчанию. При этом функция NEWID не может быть указана в качестве значения по умолчанию.A default value can be specified; however, NEWID cannot be specified as the default.

IDENTITYIDENTITY
Указывает, что новый столбец является столбцом идентификаторов.Indicates that the new column is an identity column. При добавлении в таблицу новой строки SQL ServerSQL Server формирует для столбца уникальное, последовательное значение.When a new row is added to the table, SQL ServerSQL Server provides a unique, incremental value for the column. Столбцы идентификаторов обычно используются с ограничением PRIMARY KEY для поддержания уникальности идентификаторов строк в таблице.Identity columns are typically used together with PRIMARY KEY constraints to serve as the unique row identifier for the table. Свойство IDENTITY может назначаться для столбцов типа tinyint, smallint, int, bigint, decimal(p,0) или numeric(p,0) .The IDENTITY property can be assigned to tinyint, smallint, int, bigint, decimal(p,0), or numeric(p,0) columns. Для каждой таблицы можно создать только один столбец идентификаторов.Only one identity column can be created per table. Ограниченные значения по умолчанию и ограничения DEFAULT не могут использоваться в столбце идентификаторов.Bound defaults and DEFAULT constraints cannot be used with an identity column. Необходимо указывать либо оба аргумента (и seed, и increment), либо не указывать ни одного из них.You must specify both the seed and increment or neither. Если ничего не указано, применяется значение по умолчанию (1,1).If neither is specified, the default is (1,1).

Предложение IDENTITY не может быть указано для функций CLR с табличным значением.IDENTITY cannot be specified for CLR table-valued functions.

seedseed
Целочисленное значение, присваиваемое первой строке таблицы.Is the integer value to be assigned to the first row in the table.

incrementincrement
Целочисленное значение, добавляемое к значению seed для каждой последующей строки таблицы.Is the integer value to add to the seed value for successive rows in the table.

< column_constraint >::= and < table_constraint>::=< column_constraint >::= and < table_constraint>::=

Определяет ограничение для указанного столбца или таблицы.Defines the constraint for a specified column or table. Для функций CLR единственное допустимое ограничение — NULL.For CLR functions, the only constraint type allowed is NULL. Именованные ограничения недопустимы.Named constraints are not allowed.

NULL | NOT NULLNULL | NOT NULL
Определяет, допустимы ли для столбца значения NULL.Determines whether null values are allowed in the column. Параметр NULL не является ограничением в строгом смысле слова, но может быть указан так же, как и NOT NULL.NULL is not strictly a constraint but can be specified just like NOT NULL. Ограничение NOT NULL не может быть указано для функций CLR с табличным значением.NOT NULL cannot be specified for CLR table-valued functions.

PRIMARY KEYPRIMARY KEY
Ограничение, обеспечивающее целостность сущностей для указанного столбца через уникальный индекс.Is a constraint that enforces entity integrity for a specified column through a unique index. В возвращающих табличное значение пользовательских функциях ограничение PRIMARY KEY может быть создано только для одного столбца таблицы.In table-valued user-defined functions, the PRIMARY KEY constraint can be created on only one column per table. Ограничение PRIMARY KEY не может быть указано для функций CLR с табличным значением.PRIMARY KEY cannot be specified for CLR table-valued functions.

UNIQUEUNIQUE
Ограничение, которое обеспечивает целостность сущностей для указанного столбца или столбцов с помощью уникального индекса.Is a constraint that provides entity integrity for a specified column or columns through a unique index. В таблице может быть несколько ограничений UNIQUE.A table can have multiple UNIQUE constraints. Ограничение UNIQUE не может быть указано для функций CLR с табличным значением.UNIQUE cannot be specified for CLR table-valued functions.

CLUSTERED | NONCLUSTEREDCLUSTERED | NONCLUSTERED
Указывает, что для ограничения PRIMARY KEY или UNIQUE создается кластеризованный или некластеризованный индекс.Indicate that a clustered or a nonclustered index is created for the PRIMARY KEY or UNIQUE constraint. Ограничения PRIMARY KEY используют параметр CLUSTERED, а ограничения UNIQUE используют параметр NONCLUSTERED.PRIMARY KEY constraints use CLUSTERED, and UNIQUE constraints use NONCLUSTERED.

Параметр CLUSTERED может быть указан только для одного ограничения.CLUSTERED can be specified for only one constraint. Если параметр CLUSTERED указан для ограничения UNIQUE и указано ограничение PRIMARY KEY, то PRIMARY KEY использует NONCLUSTERED.If CLUSTERED is specified for a UNIQUE constraint and a PRIMARY KEY constraint is also specified, the PRIMARY KEY uses NONCLUSTERED.

Параметры СLUSTERED и NONСLUSTERED не могут быть указаны для функций CLR с табличным значением.CLUSTERED and NONCLUSTERED cannot be specified for CLR table-valued functions.

CHECKCHECK
Ограничение, обеспечивающее целостность домена путем ограничения возможных значений, которые могут быть введены в столбец или столбцы.Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns. Ограничения CHECK не могут быть указаны для функций CLR с табличным значением.CHECK constraints cannot be specified for CLR table-valued functions.

logical_expressionlogical_expression
Логическое выражение, возвращающее значения TRUE или FALSE.Is a logical expression that returns TRUE or FALSE.

<computed_column_definition>::=<computed_column_definition>::=

Указывает вычисляемый столбец.Specifies a computed column. Дополнительные сведения о вычисляемых столбцах см. в разделе CREATE TABLE (Transact-SQL).For more information about computed columns, see CREATE TABLE (Transact-SQL).

column_namecolumn_name
Имя вычисляемого столбца.Is the name of the computed column.

computed_column_expressioncomputed_column_expression
Выражение, определяющее значение вычисляемого столбца.Is an expression that defines the value of a computed column.

<index_option>::=<index_option>::=

Указывает параметры индекса для индекса PRIMARY KEY или UNIQUE.Specifies the index options for the PRIMARY KEY or UNIQUE index. Дополнительные сведения о параметрах индекса см. в разделе CREATE INDEX (Transact-SQL).For more information about index options, see CREATE INDEX (Transact-SQL).

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }
Определяет разреженность индекса.Specifies index padding. Значение по умолчанию — OFF.The default is OFF.

FILLFACTOR = fillfactorFILLFACTOR = fillfactor
Определяет величину в процентах, указывающую, насколько компонент Компонент Database EngineDatabase Engine должен заполнять конечный уровень каждой страницы индекса во время создания или изменения индекса.Specifies a percentage that indicates how full the Компонент Database EngineDatabase Engine should make the leaf level of each index page during index creation or change. Значение fillfactor должно быть целым числом от 1 до 100.fillfactor must be an integer value from 1 to 100. Значение по умолчанию равно 0.The default is 0.

IGNORE_DUP_KEY = { ON | OFF }IGNORE_DUP_KEY = { ON | OFF }
Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный индекс повторяющиеся значения ключа.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. Параметр IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения индекса.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. Значение по умолчанию — OFF.The default is OFF.

STATISTICS_NORECOMPUTE = { ON | OFF }STATISTICS_NORECOMPUTE = { ON | OFF }
Указывает, выполнялся ли перерасчет статистики распределения.Specifies whether distribution statistics are recomputed. Значение по умолчанию — OFF.The default is OFF.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }
Указывает, разрешена ли блокировка строк.Specifies whether row locks are allowed. Значение по умолчанию — ON.The default is ON.

ALLOW_PAGE_LOCKS = { ON | OFF }ALLOW_PAGE_LOCKS = { ON | OFF }
Указывает, разрешена ли блокировка страниц.Specifies whether page locks are allowed. Значение по умолчанию — ON.The default is ON.

РекомендацииBest Practices

Если определяемая пользователем функция создана без применения предложения SCHEMABINDING, то изменения базовых объектов могут повлиять на определение функции и привести к непредвиденным результатам при вызове функции.If a user-defined function is not created with the SCHEMABINDING clause, changes that are made to underlying objects can affect the definition of the function and produce unexpected results when it is invoked. Рекомендуется реализовать один из следующих методов, чтобы обеспечить, что функция не устареет из-за изменения ее базовых объектов.We recommend that you implement one of the following methods to ensure that the function does not become outdated because of changes to its underlying objects:

  • Укажите при создании функции предложение WITH SCHEMABINDING.Specify the WITH SCHEMABINDING clause when you are creating the function. Это обеспечит невозможность изменения объектов, на которые ссылается определение функции, если при этом не изменяется сама функция.This ensures that the objects referenced in the function definition cannot be modified unless the function is also modified.

  • Выполняйте хранимую процедуру sp_refreshsqlmodule после изменения любого объекта, указанного в определении функции.Execute the sp_refreshsqlmodule stored procedure after modifying any object that is specified in the definition of the function.

Важно!

Дополнительные сведения и информацию о производительности в связи со встроенными функциями с табличным значением (встроенные TVF) или функциями с табличным значением из нескольких инструкций (MSTVF) см. в разделе Создание определяемых пользователем функций (ядро СУБД).For more information and performance considerations about inline table-valued functions (inline TVFs) and multi-statement table-valued functions (MSTVFs), see Create User-defined Functions (Database Engine).

Типы данныхData Types

Если в функции CLR указаны параметры, они должны иметь тип данных SQL ServerSQL Server, как было ранее определено для scalar_parameter_data_type.If parameters are specified in a CLR function, they should be SQL ServerSQL Server types as defined previously for scalar_parameter_data_type. Дополнительные сведения о сравнении системных типов данных SQL ServerSQL Server с типами данных интеграции со средой CLR и типами данных среды CLR платформы .NET Framework.NET Framework см. в разделе Сопоставление данных параметров CLR.For information about comparing SQL ServerSQL Server system data types to CLR integration data types or .NET Framework.NET Framework common language runtime data types, see Mapping CLR Parameter Data.

Чтобы SQL ServerSQL Server смог ссылаться на нужный метод, если он переопределен в классе, метод, указанный в <method_specifier>, должен иметь следующие характеристики:For SQL ServerSQL Server to reference the correct method when it is overloaded in a class, the method indicated in <method_specifier> must have the following characteristics:

  • Принимать то же число параметров, которое указано в [ ,...n ].Receive the same number of parameters as specified in [ ,...n ].

  • Принимать все параметры по значению, а не по ссылке.Receive all the parameters by value, not by reference.

  • Принимать типы параметров, совместимые с теми, что указаны в функции SQL ServerSQL Server.Use parameter types that are compatible with those specified in the SQL ServerSQL Server function.

Если в качестве возвращаемого значения функции CLR указан табличный тип (RETURNS TABLE), то для метода, определенного в <method_specifier>, должен быть указан возвращаемый тип IEnumerator или Enumerable, что подразумевает, что реализация этого интерфейса возлагается на автора функции.If the return data type of the CLR function specifies a table type (RETURNS TABLE), the return data type of the method in <method_specifier> should be of type IEnumerator or IEnumerable, and it is assumed that the interface is implemented by the creator of the function. В отличие от функций Transact-SQLTransact-SQL, функции CLR не могут содержать ограничений PRIMARY KEY, UNIQUE и CHECK в <table_type_definition>.Unlike Transact-SQLTransact-SQL functions, CLR functions cannot include PRIMARY KEY, UNIQUE, or CHECK constraints in <table_type_definition>. Типы данных столбцов, указанные в <table_type_definition>, должны совпадать с типами данных соответствующих столбцов результирующего набора, возвращаемого на этапе выполнения методом, указанным в <method_specifier>.The data types of columns specified in <table_type_definition> must match the types of the corresponding columns of the result set returned by the method in <method_specifier> at execution time. Проверка типов на этапе создания функции не производится.This type-checking is not performed at the time the function is created.

Дополнительные сведения о программировании функций CLR см. в разделе Определяемые пользователем функции среды CLR.For more information about how to program CLR functions, see CLR User-Defined Functions.

Общие замечанияGeneral Remarks

Скалярная функция может быть указана в любом месте вместо скалярного выражения,Scalar functions can be invoked where scalar expressions are used. в том числе в вычисляемых столбцах и определениях ограничений CHECK.This includes computed columns and CHECK constraint definitions. Кроме того, скалярная функция может быть выполнена инструкцией EXECUTE.Scalar functions can also be executed by using the EXECUTE statement. Скалярные функции должны вызываться с помощью как минимум двухкомпонентного имени ( . ).Scalar functions must be invoked by using at least the two-part name of the function (.). Дополнительные сведения о многокомпонентных именах см. в разделе Соглашения о синтаксисе в Transact-SQL (Transact-SQL).For more information about multipart names, see Transact-SQL Syntax Conventions (Transact-SQL). Функция, возвращающая табличное значение, может быть вызвана в любом месте, где допускаются табличные выражения, — в предложении FROMROM инструкций SELECT, INSERT, UPDATE или DELETE.Table-valued functions can be invoked where table expressions are allowed in the FROM clause of SELECT, INSERT, UPDATE, or DELETE statements. Дополнительные сведения см. в разделе Выполнение определяемых пользователем функций.For more information, see Execute User-defined Functions.

СовместимостьInteroperability

В функциях допустимы следующие инструкции.The following statements are valid in a function:

  • Инструкции присваивания.Assignment statements.

  • Инструкции управления потоком, за исключением инструкций TRY...CATCH.Control-of-Flow statements except TRY...CATCH statements.

  • Инструкции DECLARE, объявляющие локальные переменные и локальные курсоры.DECLARE statements defining local data variables and local cursors.

  • Инструкции SELECT, которые содержат списки выбора с выражениями, присваивающими значения локальным переменным.SELECT statements that contain select lists with expressions that assign values to local variables.

  • Операции над локальными курсорами, которые объявляются, открываются, закрываются и освобождаются в теле функции.Cursor operations referencing local cursors that are declared, opened, closed, and deallocated in the function. Допустимы только те инструкции FETCH, которые предложением INTO присваивают значения локальным переменным. Инструкции FETCH, возвращающие данные клиенту, недопустимы.Only FETCH statements that assign values to local variables using the INTO clause are allowed; FETCH statements that return data to the client are not allowed.

  • Инструкции INSERT, UPDATE и DELETE, которые изменяют локальные табличные переменные.INSERT, UPDATE, and DELETE statements modifying local table variables.

  • Инструкции EXECUTE, вызывающие расширенные хранимые процедуры.EXECUTE statements calling extended stored procedures.

Дополнительные сведения см. в разделе Создание определяемых пользователем функций (ядро СУБД).For more information, see Create User-defined Functions (Database Engine).

Взаимодействие с вычисляемыми столбцамиComputed Column Interoperability

Функции имеют перечисленные ниже свойства.Functions have the following properties. Значения этих свойств определяют, может ли данная функция быть указана в вычисляемых столбцах, которые могут быть материализованными или индексированными.The values of these properties determine whether functions can be used in computed columns that can be persisted or indexed.

СвойствоProperty ОписаниеDescription ПримечанияNotes
IsDeterministicIsDeterministic Функция детерминированная или недетерминированная.Function is deterministic or nondeterministic. Для детерминированных функций разрешается доступ к локальным данным.Local data access is allowed in deterministic functions. Например, функция, которая при вызове с одними и теми же параметрами и в одном том же состоянии базы данных всегда возвращает один и тот же результат, называется детерминированной.For example, functions that always return the same result any time they are called by using a specific set of input values and with the same state of the database would be labeled deterministic.
IsPreciseIsPrecise Функция точная или неточная.Function is precise or imprecise. Неточные функции содержат такие операции, как операции с плавающей запятой.Imprecise functions contain operations such as floating point operations.
IsSystemVerifiedIsSystemVerified SQL ServerSQL Server может проверять свойства точности и детерминированности функций.The precision and determinism properties of the function can be verified by SQL ServerSQL Server.
SystemDataAccessSystemDataAccess Функции, производящие доступ к системным данным (системным каталогам или виртуальным системным таблицам) в локальном экземпляре SQL ServerSQL Server.Function accesses system data (system catalogs or virtual system tables) in the local instance of SQL ServerSQL Server.
UserDataAccessUserDataAccess Функция производит доступ к данным пользователя в локальном экземпляре SQL ServerSQL Server.Function accesses user data in the local instance of SQL ServerSQL Server. Сюда входят определяемые пользователем и временные таблицы, но не табличные переменные.Includes user-defined tables and temp tables, but not table variables.

Для функций Transact-SQLTransact-SQL свойства точности и детерминизма SQL ServerSQL Server определяет автоматически.The precision and determinism properties of Transact-SQLTransact-SQL functions are determined automatically by SQL ServerSQL Server. Свойства доступа к данным и детерминированности функций CLR могут быть указаны пользователем.The data access and determinism properties of CLR functions can be specified by the user. Дополнительные сведения см. в разделе Общие сведения о пользовательских атрибутах интеграции со средой CLR.For more information, see Overview of CLR Integration Custom Attributes.

Для отображения текущих значений этих свойств используйте функцию OBJECTPROPERTYEX.To display the current values for these properties, use OBJECTPROPERTYEX.

Важно!

Функции необходимо создавать с детерминированным SCHEMABINDING.Functions must be created with SCHEMABINDING to be deterministic.

Вычисляемый столбец, который обращается к определяемой пользователем функции, может быть включен в индекс, если функция имеет следующие значения свойств:A computed column that invokes a user-defined function can be used in an index when the user-defined function has the following property values:

  • IsDeterministic = trueIsDeterministic = true
  • IsSystemVerified = true (если вычисляемый столбец не является сохраняемым)IsSystemVerified = true (unless the computed column is persisted)
  • UserDataAccess = falseUserDataAccess = false
  • SystemDataAccess = falseSystemDataAccess = false

Дополнительные сведения см. в разделе Индексы вычисляемых столбцов.For more information, see Indexes on Computed Columns.

Вызов расширенной хранимой процедуры из функцийCalling Extended Stored Procedures from Functions

Расширенные хранимые процедуры, если они вызываются из тела функции, не могут возвращать клиенту результирующие наборы.The extended stored procedure, when it is called from inside a function, cannot return result sets to the client. Все API ODS, которые возвращают результирующие наборы клиенту, вернут FAIL.Any ODS APIs that return result sets to the client will return FAIL. Расширенная хранимая процедура может подключаться к экземпляру SQL ServerSQL Server, но она не должна пытаться присоединиться к той же транзакции, что и функция, из которой вызвана расширенная хранимая процедура.The extended stored procedure could connect back to an instance of SQL ServerSQL Server; however, it should not try to join the same transaction as the function that invoked the extended stored procedure.

Как и при вызове из пакета или хранимой процедуры, расширенная хранимая процедура будет выполняться в контексте учетной записи системы безопасности Windows, от имени которой выполняется SQL ServerSQL Server.Similar to invocations from a batch or stored procedure, the extended stored procedure will be executed in the context of the Windows security account under which SQL ServerSQL Server is running. Владелец хранимой процедуры должен это понимать, когда он предоставляет пользователям разрешение EXECUTE на нее.The owner of the stored procedure should consider this when giving EXECUTE permission on it to users.

ОграниченияLimitations and Restrictions

Определяемые пользователем функции не могут выполнять действия, изменяющие состояние базы данных.User-defined functions cannot be used to perform actions that modify the database state.

Определяемые пользователем функции не могут содержать предложение OUTPUT INTO, целью которого является таблица.User-defined functions cannot contain an OUTPUT INTO clause that has a table as its target.

Следующие инструкции компонента Компонент Service BrokerService Broker не могут быть включены в определение определяемой пользователем функции Transact-SQLTransact-SQL:The following Компонент Service BrokerService Broker statements cannot be included in the definition of a Transact-SQLTransact-SQL user-defined function:

  • BEGIN DIALOG CONVERSATION

  • END CONVERSATION

  • GET CONVERSATION GROUP

  • MOVE CONVERSATION

  • RECEIVE

  • SEND

Определяемые пользователем функции могут быть вложенными, то есть из одной функции может быть вызвана другая.User-defined functions can be nested; that is, one user-defined function can call another. Уровень вложенности увеличивается на единицу каждый раз, когда начинается выполнение вызванной функции и уменьшается на единицу, когда ее выполнение завершается.The nesting level is incremented when the called function starts execution, and decremented when the called function finishes execution. Вложенность определяемых пользователем функций не может превышать 32 уровней.User-defined functions can be nested up to 32 levels. Превышение максимального уровня вложенности приводит к ошибке выполнения для всей цепочки вызываемых функций.Exceeding the maximum levels of nesting causes the whole calling function chain to fail. Каждый вызов управляемого кода из определяемой пользователем функции Transact-SQLTransact-SQL считается за один уровень вложенности из 32 возможных.Any reference to managed code from a Transact-SQLTransact-SQL user-defined function counts as one level against the 32-level nesting limit. Методы, вызываемые из управляемого кода, под это ограничение не подпадают.Methods invoked from within managed code do not count against this limit.

Использование порядка сортировки в функциях CLR с табличным значениемUsing Sort Order in CLR Table-valued Functions

При использовании предложения ORDER в функциях CLR с табличным значением придерживайтесь следующих рекомендаций.When using the ORDER clause in CLR table-valued functions, follow these guidelines:

  • Необходимо гарантировать, чтобы результаты всегда были упорядочены в указанном порядке.You must ensure that results are always ordered in the specified order. Если результаты находятся не в указанном порядке, при выполнении запроса SQL ServerSQL Server сформирует сообщение об ошибке.If the results are not in the specified order, SQL ServerSQL Server will generate an error message when the query is executed.

  • Если указано предложение ORDER, выходные данные функции с табличным значением должны быть отсортированы в соответствии с параметрами сортировки столбца (явными или неявными).If an ORDER clause is specified, the output of the table-valued function must be sorted according to the collation of the column (explicit or implicit). Например, если для столбца используются параметры сортировки для китайского языка (указанные в определении функции с табличным значением или полученные из параметров сортировки базы данных), то возвращаемые результаты должны быть отсортированы в соответствии с правилами сортировки, принятыми в китайском языке.For example, if the column collation is Chinese (either specified in the DDL for the table-valued function or obtained from the database collation), the returned results must be sorted according to Chinese sorting rules.

  • При использовании предложение ORDER всегда проверяется SQL ServerSQL Server при возврате результатов, независимо от его использования обработчиком запросов для выполнения оптимизации.The ORDER clause, if specified, is always verified by SQL ServerSQL Server while returning results, whether or not it is used by the query processor to perform further optimizations. Рекомендуется использовать предложение ORDER только при уверенности в его пользе для обработчика запросов.Only use the ORDER clause if you know it is useful to the query processor.

  • Обработчик запросов SQL ServerSQL Server автоматически использует преимущества предложения ORDER в следующих случаях.The SQL ServerSQL Server query processor takes advantage of the ORDER clause automatically in following cases:

    • Запросы Insert, в которых предложение ORDER совместимо с индексом.Insert queries where the ORDER clause is compatible with an index.

    • Предложения ORDER BY, совместимые с предложением ORDER.ORDER BY clauses that are compatible with the ORDER clause.

    • Статистические выражения, где GROUP BY совместим с предложением ORDER.Aggregates, where GROUP BY is compatible with ORDER clause.

    • Статистические выражения с ключевым словом DISTINCT, в которых уникальные столбцы совместимы с предложением ORDER.DISTINCT aggregates where the distinct columns are compatible with the ORDER clause.

Предложение ORDER не гарантирует упорядочивания результатов при выполнении запроса SELECT, если ORDER BY не указано в самом запросе.The ORDER clause does not guarantee ordered results when a SELECT query is executed, unless ORDER BY is also specified in the query. Сведения о запросе столбцов, включенных в порядок сортировки для функций с табличным значением, см. в разделе sys.function_order_columns (Transact-SQL).See sys.function_order_columns (Transact-SQL) for information on how to query for columns included in the sort-order for table-valued functions.

МетаданныеMetadata

В следующей таблице приводятся системные представления каталога, возвращающие метаданные об определяемых пользователем функциях.The following table lists the system catalog views that you can use to return metadata about user-defined functions.

Системное представлениеSystem View ОписаниеDescription
sys.sql_modulessys.sql_modules См. пример Д, приведенный ниже в разделе с примерами.See example E in the Examples section below.
sys.assembly_modulessys.assembly_modules Выводит сведения об определяемых пользователем функциях CLR.Displays information about CLR user-defined functions.
sys.parameterssys.parameters Выводит сведения о параметрах, определенных в определяемых пользователем функциях.Displays information about the parameters defined in user-defined functions.
sys.sql_expression_dependenciessys.sql_expression_dependencies Отображает базовые объекты, на которые ссылается функция.Displays the underlying objects referenced by a function.

РазрешенияPermissions

Требуется разрешение CREATE FUNCTION на базу данных и разрешение ALTER на схему, в которой создается функция.Requires CREATE FUNCTION permission in the database and ALTER permission on the schema in which the function is being created. Если в функции указан определяемый пользователем тип, требуется разрешение EXECUTE на этот тип.If the function specifies a user-defined type, requires EXECUTE permission on the type.

ПримерыExamples

Примечание

Дополнительные примеры и рекомендации по производительности для определяемых пользователем функций см. в разделе Создание определяемых пользователем функций (ядро СУБД).For more examples and performance considerations about UDFs, see Create User-defined Functions (Database Engine).

A.A. Применение скалярной определяемой пользователем функции, вычисляющей неделю по ISOUsing a scalar-valued user-defined function that calculates the ISO week

В следующем примере показано создание определяемой пользовательской функции ISOweek,The following example creates the user-defined function ISOweek. которая получает в качестве аргумента дату и вычисляет номер недели по ISO.This function takes a date argument and calculates the ISO week number. Для правильной работы этой функции перед ее вызовом должна быть выполнена инструкция SET DATEFIRST 1.For this function to calculate correctly, SET DATEFIRST 1 must be invoked before the function is called.

Следующий пример также показывает использование предложения EXECUTE AS для указания контекста безопасности, в котором может быть выполнена хранимая процедура.The example also shows using the EXECUTE AS clause to specify the security context in which a stored procedure can be executed. В этом примере параметр CALLER указывает, что процедура будет выполнена в контексте пользователя, который ее вызывает.In the example, the option CALLER specifies that the procedure will be executed in the context of the user that calls it. Также могут быть указаны параметры SELF, OWNER и user_name.The other options that you can specify are SELF, OWNER, and user_name.

Показан вызов функции.Here is the function call. Обратите внимание, что DATEFIRST устанавливается в значение 1.Notice that DATEFIRST is set to 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';  

Ниже приводится результирующий набор.Here is the result set.

ISO Week  
----------------  
52  

Б.B. Создание встроенной функции с табличным значениемCreating an inline table-valued function

Результатом следующего примера является встроенная функция, возвращающая табличное значение в базу данных AdventureWorks2012AdventureWorks2012.The following example returns an inline table-valued function in the AdventureWorks2012AdventureWorks2012 database. Для каждого из товаров, проданных в магазине, она возвращает три столбца: ProductID, Name и статистику с начала года по магазину — YTD Total.It returns three columns ProductID, Name and the aggregate of year-to-date totals by store as YTD Total for each product sold to the store.

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   
    JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID  
    JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID  
    JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID  
    WHERE C.StoreID = @storeid  
    GROUP BY P.ProductID, P.Name  
);  
GO  

При вызове этой функции выполняется следующий запрос.To invoke the function, run this query.

SELECT * FROM Sales.ufn_SalesByStore (602);  

В.C. Создание функции с табличным значением из нескольких инструкцийCreating a multi-statement table-valued function

В следующем примере создается функция с табличным значением fn_FindReports(InEmpID) в базе данных AdventureWorks2012.The following example creates the table-valued function fn_FindReports(InEmpID) in the AdventureWorks2012 database. Если ей передать допустимый идентификатор сотрудника, она вернет таблицу, в которой содержатся все сотрудники, которые прямо или опосредованно перед ним отчитываются.When supplied with a valid employee ID, the function returns a table that corresponds to all the employees that report to the employee either directly or indirectly. В функции для построения иерархического списка сотрудников используется рекурсивное обобщенное табличное выражение (CTE).The function uses a recursive common table expression (CTE) to produce the hierarchical list of employees. Дополнительные сведения о рекурсивных обобщенных табличных выражениях см. в разделе WITH common_table_expression (Transact-SQL).For more information about recursive CTEs, see WITH common_table_expression (Transact-SQL).

CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)  
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, e.OrganizationNode, 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. Создание функции CLRCreating a CLR function

В следующем примере создается функция CLR len_s.The example creates CLR function len_s. Перед ее созданием сборка SurrogateStringFunction.dll регистрируется в локальной базе данных.Before the function is created, the assembly SurrogateStringFunction.dll is registered in the local database.

Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 с пакетом обновления 1 (SP1) по SQL ServerSQL Server)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 SP1 through SQL ServerSQL Server)

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 с табличным значением.For an example of how to create a CLR table-valued function, see CLR Table-Valued Functions.

Д.E. Отображение определения определяемых пользователем функций Transact-SQLTransact-SQLDisplaying the definition of Transact-SQLTransact-SQL user-defined functions

SELECT definition, type   
FROM sys.sql_modules AS m  
JOIN sys.objects AS o ON m.object_id = o.object_id   
    AND type IN ('FN', 'IF', 'TF');  
GO  

Определения зашифрованных функций, созданных с помощью параметра ENCRYPTION, в sys.sql_modules не отображаются, но все остальные сведения о них доступны.The definition of functions created by using the ENCRYPTION option cannot be viewed by using sys.sql_modules; however, other information about the encrypted functions is displayed.

См. также:See Also

Создание определяемых пользователем функций (компонент Database Engine) Create User-defined Functions (Database Engine)
ALTER FUNCTION (Transact-SQL) ALTER FUNCTION (Transact-SQL)
DROP FUNCTION (Transact-SQL) DROP FUNCTION (Transact-SQL)
OBJECTPROPERTYEX (Transact-SQL) OBJECTPROPERTYEX (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
Определяемые пользователем функции среды CLR CLR User-Defined Functions
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
CREATE SECURITY POLICY (Transact-SQL)CREATE SECURITY POLICY (Transact-SQL)