Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:Конечная точка аналитики SQL в Microsoft Fabric и хранилище в Microsoft Fabric
CREATE FUNCTION создаёт встроенные табличные функции и скалярные функции.
Примечание.
Скалярные определяемые пользователем функции — это предварительная версия в хранилище данных Fabric.
Это важно
В хранилище данных Fabric скалярные определяемые пользователем функции должны быть встроенными для использования с SELECT ... FROM запросами в пользовательских таблицах, но вы по-прежнему можете создавать функции, которые не являются встроенными. Скалярные UDF, которые не являются линейными, работают в ограниченном числе сценариев. Вы можете проверить, можно ли встраить UDF.
Пользовательская функция — это Transact-SQL процедура, которая принимает параметры, выполняет действие, например, комплексное вычисление, и возвращает результат этого действия в виде значения. Скалярные функции возвращают скалярное значение, например число или строку. Определяемые пользователем табличные функции (TVFs) возвращают таблицу.
Используйте CREATE FUNCTION для создания повторно используемой T-SQL процедуры, которую можно использовать следующим образом:
- В инструкциях Transact-SQL, таких как
SELECT - В Transact-SQL операторах обработки данных (DML), таких как
UPDATE,INSERTиDELETE - В приложениях, вызывающих функцию.
- В определении другой пользовательской функции.
- Для замены хранимой процедуры.
Вы можете задать CREATE OR ALTER FUNCTION создание новой функции, если её нет под этим именем, или изменить существующую функцию в одном операторе.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис скалярной функции
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Встроенный синтаксис функции с табличным значением
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Аргументы
schema_name
Имя схемы, к которой принадлежит определяемая пользователем функция.
function_name
Имя определяемой пользователем функции. Имена функций должны соответствовать правилам идентификаторов и быть уникальными внутри базы данных и её схемы.
Примечание.
Вы должны добавить скобки после имени функции, даже если параметр не указан.
@ parameter_name
Параметр в пользовательской функции. Вы можете объявить один или несколько параметров.
Функция может иметь до 2 100 параметров. Когда пользователь или приложение вызывает функцию, значение каждого объявленного параметра должно быть указано, если только для этого параметра не определено по умолчанию.
Определяет имя параметра, используя знак @ как первый символ. Имя параметра должно соответствовать правилам идентификаторов. Параметры локальны для функции; Вы можете использовать те же имена параметров в других функциях. Параметры могут заменять только константы; Их нельзя использовать вместо имён таблиц, имён столбцов или других объектов базы данных.
Примечание.
ANSI_WARNINGS не учитывается при передаче параметров в хранимой процедуре, определяемой пользователем функции или при объявлении и установке переменных в пакетной инструкции. Например, если определить переменную как char(3), а затем установить значение больше трёх символов, данные усекаются до определённого размера, и SQL-оператор работает успешно.
parameter_data_type
Тип данных параметра. Для функций Transact-SQL поддерживаются все скалярные типы данных .
[ = по умолчанию ]
Значение параметра по умолчанию. Если определить значение по умолчанию , можно выполнить функцию без указания значения для этого параметра.
Если параметр функции имеет значение по умолчанию, необходимо указать ключевое слово DEFAULT при вызове функции, чтобы получить его по умолчанию. Применение ключевого слова DEFAULT следует отличать от использования аргументов со значениями по умолчанию в хранимых процедурах, когда не указанный аргумент неявно принимает значение по умолчанию.
return_data_type
Возвращаемое значение скалярной функции, определяемой пользователем.
Для функций в хранилище данных Fabric разрешены все типы данных, за исключениемметки времени/. Нескалярные типы, такие как таблицы , не разрешены.
function_body
Ряд операторов Transact-SQL.
В скалярных функциях function_body представляет собой ряд операторов Transact-SQL , которые вместе оценивают скалярное значение, которое может включать:
- Выражение одной инструкции
- Выражения с несколькими операторами (
IF/THEN/ELSEиBEGIN/ENDблоки) - Локальные переменные
- Вызовы встроенных функций SQL
- Вызовы других определяемых пользователем функций
-
SELECTоператоры и ссылки на таблицы, представления и встроенные функции с табличным значением - Операторы управления потоком (
WHILEциклы,RETURNS)
scalar_expression
Указывает скалярное значение, возвращаемое скалярной функцией.
select_stmt
SELECT Одна инструкция, определяющая возвращаемое значение встроенной табличной функции. Для функции с встроенным таблицным значением тела функции не существует; Таблица — это набор результатов одного SELECT оператора.
TABLE
Указывает, что возвращаемым значением функции с табличным значением (TVF) является таблица. Вы можете передавать только константы и @local_variables TVF.
В встроенных TVF (предварительный просмотр) вы определяете TABLE возвратное значение через один SELECT оператор. Встроенные функции не имеют связанных переменных возврата.
<function_option>
В Fabric Data Warehouse INLINEключевые слова , ENCRYPTION, и EXECUTE AS не поддерживаются.
Поддерживаемые функции включают:
SCHEMABINDING
Указывает, что функция привязана к объектам базы данных, которые содержат ссылки на нее. Когда вы задаёте SCHEMABINDING, вы не можете изменить исходные объекты (например, вид или таблицу) так, чтобы это влияло на определение функции. Сначала нужно изменить или отказаться от определения функции, чтобы убрать зависимости от объекта, который вы хотите изменить.
Привязка функции к ссылающимся на нее объектам удаляется в следующих случаях:
Ты отключаешь функцию.
Вы
ALTERиспользуете оператор функции и удалите этуSCHEMABINDINGопцию.
Вы можете связать функцию схемой только при выполнении следующих условий:
Любые пользовательские функции, на которые ссылается функция, также связаны со схемой.
Функция ссылается на объекты с помощью двухчастного имени.
Внутри корпуса UDF можно ссылаться только на встроенные функции и другие UDF в одной базе данных.
Пользователь, исполняющий этот
CREATE FUNCTIONоператор, имеет право REFERENCES на объекты базы данных, на которые ссылается функция.
Чтобы удалить SCHEMABINDING, используйте ALTER.
ВОЗВРАЩАЕТ ЗНАЧЕНИЕ NULL ДЛЯ ВХОДНЫХ ДАННЫХ NULL | ВЫЗЫВАЕТСЯ ДЛЯ ВХОДНЫХ ДАННЫХ NULL
Задает OnNULLCall атрибут скалярной функции. Если не указать этот атрибут, то CALLED ON NULL INPUT подразумевается по умолчанию, и тело функции выполняется даже если NULL оно передаётся как аргумент.
Рекомендации
Если вы не создаёте пользовательскую функцию с помощью schemabinding, изменения в базовых объектах могут повлиять на определение функции и вызвать неожиданные результаты при её вызове. Когда вы указываете
WITH SCHEMABINDINGмомент создания функции, вы гарантируете, что последующие изменения в базовых объектах не смогут изменить или нарушить поведение функции.Пишите свои пользовательские функции так, чтобы они были нелинейными. Для получения дополнительной информации см. раздел «Инлайнирование скалярного UDF».
Совместимость
Встроенные пользовательские функции с табличным значением
Встроенная функция с таблицным значением принимает только один SELECT оператор.
Скалярные пользовательские функции
В скалярных функциях допустимы следующие инструкции с одиночным значением.
- Инструкции присваивания.
- Операторы Control-of-Flow, кроме
TRY...CATCHиGO..TOоператоров. -
DECLAREоператоры, определяющие локальные переменные данных. - Ссылки на таблицы/виды/iTVF/другие скалярные UDF.
В теле функции с скалярным значением не поддерживаются следующие встроенные функции:
Ограничения
Примечание.
Во время текущей предварительной версии ограничения могут быть изменены.
Нельзя использовать пользовательские функции для выполнения действий, изменяющих состояние базы данных.
Можно вкладывать пользовательские функции. То есть одна определяемая пользователем функция может вызывать другую. Уровень вложения увеличивается при начале выполнения вызываемой функции, а уменьшается — когда вызванная функция завершает выполнение. В Fabric Data Warehouse вы можете вкладывать пользовательские функции до четырёх уровней, если тело UDF ссылается на таблицу, представление или функцию с встроенными значениями таблицы, или до 32 уровней в противном случае. Если вы превысите максимальный уровень вложения, цепочка вызова функций не выходит из строя.
Скалярные определяемые пользователем функции нельзя использовать в запросе в пользовательской
SELECT ... FROMтаблице, если:- Тело UDF содержит вызов недетерминированной встроенной функции (например
GETDATE(), ), см. Детерминированные и недетерминированные функции. - Тело UDF содержит
BREAKилиCONTINUEутверждение. - Существует рекурсивный скалярный вызов UDF.
- Тело UDF содержит вызов недетерминированной встроенной функции (например
Скалярный UDF не может использоваться во всех формах запроса, таких как CTE, и
GROUP BYкогда:- Скалярное тело UDF содержит ссылки на таблицы/виды/iTVF/другие скалярные UDF.
- Скалярный UDF содержит любой из этих типов данных в качестве входного параметра, локальной переменной или возвратного типа данных: varchar(max), nvarchar(max), varbinary(max), binary(max).
- Скалярное тело UDF содержит вызовы функций ИИ.
- В приведённых выше случаях применимы общие требования к скалярному инлайнированию UDF, см. требования к скалярному UDF инлайнированию.
Если скалярный UDF содержит одно из следующего, пользовательский запрос может провалиться, если в одном запросе совершается более 10 UDF-вызовов:
- Скалярное тело UDF содержит ссылки на таблицы/виды/iTVF/другие скалярные UDF.
- Скалярный UDF содержит любой из этих типов данных в качестве входного параметра, локальной переменной или возвратного типа данных: varchar(max), nvarchar(max), varbinary(max), binary(max).
- Скалярное тело UDF содержит вызовы функций ИИ.
Когда скалярный UDF используется в любом неподдерживаемом сценарии, при выполнении запроса появляется сообщение об ошибке «
Scalar UDF execution is currently unavailable in this context.».
Метаданные
В следующем разделе приводятся системные представления каталога, возвращающие метаданные об определяемых пользователем функциях.
sys.sql_modules: отображает определение Transact-SQL пользовательских функций, а также информацию о инлайнируемости. Например:
SELECT SCHEMA_NAME(o.schema_id) AS SchemaName, o.name AS FunctionName, m.definition AS FunctionDefinition, m.is_inlineable AS Inlineable, m.inline_eligibility_mask AS InlineEligibilityMask FROM sys.objects o JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE o.type = 'FN';sys.parameters: отображает сведения о параметрах, определенных в определяемых пользователем функциях.
sys.sql_expression_dependencies: отображает базовые объекты, на которые ссылается функция.
Разрешения
Члены роли администратора рабочей области Fabric, участника и участника могут создавать функции.
Инлайнирование скалярного UDF
Microsoft Fabric Data Warehouse использует различные техники инлайнирования для компиляции и выполнения пользовательского кода в распределённой форме.
Инлайнирование скалярного UDF по умолчанию включено.
Некоторый синтаксис T-SQL делает скалярный UDF нелинейным. Например, функции, содержащие комбинацию WHILE цикла и ссылающиеся на таблицу внутри тела UDF, не могут быть инлайнированы.
Проверьте, можно ли встраить скалярную UDF
Представление sys.sql_modules каталога содержит столбец is_inlineable, указывающий, является ли UDF встроенным. Свойство is_inlineable возникает при проверке синтаксиса внутри определения UDF. Скалярный UDF не инлайнирован до момента компиляции.
В этом inline_eligibility_mask свойстве объясняется, какой тип инлайнинга применим к UDF.
- Значение означает
0, что UDF не является линейным. - Значение указывает
1на то, что UDF подходит для инлайнирования скалярных UDF. - Значение означает
2, что UDF может быть инлайнирован через блок экспрессии. - Значение означает
3, что UDF подходит для любой из методов инлайнирования.
Если скалярный UDF нелинейный, это не гарантирует, что он всегда инлайнирован при компиляции запроса.
Fabric Data Warehouse решает (по запросу), какую технику инлайнирования применять.
Используйте следующий пример запроса, чтобы проверить, является ли скалярный UDF встроенным:
SELECT
SCHEMA_NAME(b.schema_id) as function_schema_name,
b.name as function_name,
b.type_desc as function_type,
a.is_inlineable
FROM sys.sql_modules AS a
INNER JOIN sys.objects AS b
ON a.object_id = b.object_id
WHERE b.type IN ('FN');
Если скалярная функция не является инлайнируемой в sys.sql_modules.is_inlineable, вы всё равно можете выполнить запрос как отдельный вызов, например, для установки переменной. Но скалярная функция не может быть частью SELECT ... FROM запроса в пользовательской таблице. Например:
CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
RETURNS datetime2(6)
AS
BEGIN
RETURN SYSUTCDATETIME();
END
Выборка dbo.custom_SYSUTCDATETIME скалярной пользовательской функции не является линейной из-за использования недетерминантной системной функции. SYSUTCDATETIME() Он не работает при использовании в SELECT ... FROM запросе к пользовательской таблице, но успешно работает как самостоятельный вызов. Например:
DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';
Примеры
А. Создание встроенной табличной функции
Следующий пример создаёт встроенную функцию со значением таблицы, которая возвращает ключевую информацию о модулях, фильтруя по параметру objectType . Он включает значение по умолчанию для возврата всех модулей при вызове функции с параметром DEFAULT . В этом примере используются некоторые из представлений системных каталогов, упомянутых в метаданных.
CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
SELECT sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.DEFINITION AS 'Module Description',
sm.is_inlineable AS 'Inlineable'
FROM sys.sql_modules AS sm
INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type LIKE '%' + @objectType + '%'
);
GO
Вызовите функцию для возврата всех входящих таблицных функций (IF):
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
Или найдите все скалярные функции (FN):
SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION
В. Объединение результатов встроенной табличной функции
Этот простой пример использует ранее созданный встроенный TVF, чтобы показать, как можно комбинировать его результаты с другими таблицами с CROSS APPLYпомощью . Здесь вы выбираете все столбцы из обоих sys.objects и результаты для ModulesByType всех строк, совпадающих в столбце type . Для получения дополнительной информации о использовании APPLYсм. пункт FROM плюс JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO
С. Создание скалярной функции UDF
В следующем примере создается встроенный скалярный UDF, который маскирует входной текст.
CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Result VARCHAR(50)
DECLARE @CleanedInput VARCHAR(50)
-- Trim whitespace
SET @CleanedInput = LTRIM(RTRIM(@InputString))
-- Handle empty or null input
IF @CleanedInput = '' OR @CleanedInput IS NULL
BEGIN
SET @Result = ''
END
ELSE IF LEN(@CleanedInput) <= 2
BEGIN
-- If string length is 1 or 2, just return the cleaned string
SET @Result = @CleanedInput
END
ELSE
BEGIN
-- Construct the masked string
SET @Result =
LEFT(@CleanedInput, 1) +
REPLICATE('*', LEN(@CleanedInput) - 2) +
RIGHT(@CleanedInput, 1)
END
RETURN @Result
END
Эту функцию можно вызвать следующим образом:
DECLARE @input varchar(100) = '123456789'
SELECT dbo.cleanInput (@input) AS function_output;
Дополнительные примеры использования скалярных определяемых пользователем файлов в хранилище данных Fabric:
В инструкции SELECT :
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
В предложении WHERE :
SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'
В предложении JOIN :
SELECT t1.id, t1.name,
dbo.cleanInput (t1.name) AS function_output,
dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
INNER JOIN dbo.MyTable2 AS t2
ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);
В предложении ORDER BY :
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
В операторах языка обработки данных (DML), таких как INSERT, UPDATEили DELETE:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;
UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;
DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';
Связанный контент
Область применения:Azure Synapse Analytics Analytics
Platform System (PDW)
Создает определяемую пользователем функцию (UDF) в Azure Synapse Analytics или Analytics Platform System (PDW). Определяемая пользователем функция представляет собой подпрограмму Transact-SQL, которая принимает параметры, выполняет действие, например сложное вычисление, а затем возвращает результат этого действия в виде значения. Определяемые пользователем табличные функции (TVFs) возвращают тип данных таблицы.
Подсказка
Для синтаксиса в Fabric Data Warehouse см. версию CREATE FUNCTION для Fabric Data Warehouse.
В системе платформы аналитики (PDW) возвращаемое значение должно быть скалярным (одним) значением.
В Azure Synapse Analytics
CREATE FUNCTIONможно возвращать таблицу с помощью синтаксиса встроенных табличных функций (предварительная версия) или возвращать одно значение с помощью синтаксиса скалярных функций.В бессерверных пулах SQL в Azure Synapse Analytics можно создавать встроенные функции табличного значения,
CREATE FUNCTIONно не скалярные функции.Используйте это утверждение, чтобы создать многоразовую рутину, которую можно использовать следующим образом:
В инструкциях Transact-SQL, таких как
SELECTВ приложениях, вызывающих функцию
В определении другой пользовательской функции.
Для определения ограничения CHECK на столбец.
Для замены хранимой процедуры.
Использование встроенной функции в качестве предиката фильтра для политики безопасности
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис скалярной функции
-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Встроенный синтаксис функции с табличным значением
-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Аргументы
schema_name
Имя схемы, к которой принадлежит определяемая пользователем функция.
function_name
Имя определяемой пользователем функции. Имена функций должны соответствовать правилам идентификаторов и быть уникальными внутри базы данных и её схемы.
Примечание.
Вы должны добавить скобки после имени функции, даже если параметр не указан.
@ parameter_name
Параметр в пользовательской функции. Вы можете объявить один или несколько параметров.
Функция может иметь до 2 100 параметров. Когда пользователь или приложение вызывает функцию, значение каждого объявленного параметра должно быть указано, если только для этого параметра не определено по умолчанию.
Определяет имя параметра, используя знак @ как первый символ. Имя параметра должно соответствовать правилам идентификаторов. Параметры локальны для функции; Вы можете использовать те же имена параметров в других функциях. Параметры могут заменять только константы; Их нельзя использовать вместо имён таблиц, имён столбцов или других объектов базы данных.
Примечание.
ANSI_WARNINGS не учитывается при передаче параметров в хранимой процедуре, определяемой пользователем функции или при объявлении и установке переменных в пакетной инструкции. Например, если определить переменную как char(3), а затем установить значение больше трёх символов, данные урезают до определённого размера, и INSERT оператор or UPDATE выполняется успешно.
parameter_data_type
Тип данных параметра. Для функций Transact-SQL допускаются все скалярные типы данных, которые поддерживаются в Azure Synapse Analytics. Тип данных с временной меткой (rowversion) не поддерживается.
[ = по умолчанию ]
Значение параметра по умолчанию. Если определить значение по умолчанию , можно выполнить функцию без указания значения для этого параметра.
Если параметр функции имеет значение по умолчанию, необходимо указать ключевое слово DEFAULT при вызове функции, чтобы получить его по умолчанию. Применение ключевого слова DEFAULT следует отличать от использования аргументов со значениями по умолчанию в хранимых процедурах, когда не указанный аргумент неявно принимает значение по умолчанию.
return_data_type
Возвращаемое значение скалярной функции, определяемой пользователем. Для функций Transact-SQL допускаются все скалярные типы данных, которые поддерживаются в Azure Synapse Analytics. Типданных с временной меткой/ не поддерживается. Курсор и нескалярные типы не разрешены.
function_body
Ряд инструкций Transact-SQL.
function_body не может содержать SELECT оператор и не может ссылаться на данные базы данных.
function_body не может ссылаться на таблицы или представления. Тело функций может вызывать другие детерминированные функции, но не может вызывать недетерминированные функции.
Для скалярных функций function_body представляет собой ряд инструкций Transact-SQL, совместное выполнение которых вычисляет скалярное выражение.
scalar_expression
Указывает скалярное значение, возвращаемое скалярной функцией.
select_stmt
SELECT Одна инструкция, определяющая возвращаемое значение встроенной табличной функции. Для функции с встроенным таблицным значением тела функции не существует; Таблица — это набор результатов одного SELECT оператора.
TABLE
Указывает, что возвращаемым значением функции с табличным значением (TVF) является таблица. Вы можете передавать только константы и @local_variables TVF.
В встроенных TVF (предварительный просмотр) вы определяете TABLE возвратное значение через один SELECT оператор. Встроенные функции не имеют связанных переменных возврата.
<function_option>
Указывает, что функция имеет один или несколько следующих параметров.
SCHEMABINDING
Указывает, что функция привязана к объектам базы данных, которые содержат ссылки на нее. Когда вы задаёте SCHEMABINDING, вы не можете изменить исходные объекты (например, вид или таблицу) так, чтобы это влияло на определение функции. Сначала нужно изменить или отказаться от определения функции, чтобы убрать зависимости от объекта, который вы хотите изменить.
Привязка функции к ссылающимся на нее объектам удаляется в следующих случаях:
Ты отключаешь функцию.
Вы
ALTERиспользуете оператор функции и удалите этуSCHEMABINDINGопцию.
Вы можете связать функцию схемой только при выполнении следующих условий:
Любые пользовательские функции, на которые ссылается функция, также связаны со схемой.
Ссылки на функции используют имена из одной или двух частей.
Внутри корпуса UDF можно ссылаться только на встроенные функции и другие UDF в одной базе данных.
Пользователь, исполняющий этот
CREATE FUNCTIONоператор, имеет право REFERENCES на объекты базы данных, на которые ссылается функция.
Чтобы удалить SCHEMABINDING, используйте ALTER.
ВОЗВРАЩАЕТ ЗНАЧЕНИЕ NULL ДЛЯ ВХОДНЫХ ДАННЫХ NULL | ВЫЗЫВАЕТСЯ ДЛЯ ВХОДНЫХ ДАННЫХ NULL
Задает OnNULLCall атрибут скалярной функции. Если не указать этот атрибут, то CALLED ON NULL INPUT подразумевается по умолчанию, и тело функции выполняется даже если NULL оно передаётся как аргумент.
Рекомендации
Если вы не создаёте пользовательскую функцию с клаузой SCHEMABINING, изменения в базовых объектах могут повлиять на определение функции и вызвать неожиданные результаты при её вызове. Указывайте клаузу WITH SCHEMABINDING при создании функции. Это предложение гарантирует, что вы не сможете изменить объекты, указанные в определении функции, если вы не измените и саму функцию.
Совместимость
В скалярных функциях допустимы следующие инструкции с одиночным значением.
Инструкции присваивания.
Операторы управления потоком, кроме TRY... Ключевые заявления.
Операторы DECIDE, определяющие локальные переменные данных.
В функции с встроенным таблицным значением (предпросмотр) можно использовать только один оператор select.
Ограничения
Нельзя использовать пользовательские функции для выполнения действий, изменяющих состояние базы данных.
Можно вкладывать пользовательские функции. Одна пользовательская функция может вызывать другую. Уровень вложения увеличивается при начале выполнения вызываемой функции, а уменьшается — когда вызванная функция завершает выполнение. Если вы превышаете максимальные уровни вложения, вся цепочка вызывающих функций выходит из строя.
Вы не можете создавать объекты, включая функции, в master базе данных вашего серверного SQL-пула в Azure Synapse Analytics.
Метаданные
В следующем разделе приводятся системные представления каталога, возвращающие метаданные об определяемых пользователем функциях.
sys.sql_modules: отображает определение Transact-SQL определяемых пользователем функций. Например:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');sys.parameters: отображает сведения о параметрах, определенных в определяемых пользователем функциях.
sys.sql_expression_dependencies: отображает базовые объекты, на которые ссылается функция.
Разрешения
Требуется CREATE FUNCTION разрешение в базе данных и разрешение ALTER на схеме, в которой создаётся функция.
Примеры
А. Использование скалярной определяемой пользователем функции для изменения типа данных
Эта простая функция принимает int-тип данных в качестве входа и возвращает десятичный(10,2) тип данных в качестве выхода.
CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)
RETURNS decimal(10,2)
AS
BEGIN
DECLARE @MyValueOut int;
SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));
RETURN(@MyValueOut);
END;
GO
SELECT dbo.ConvertInput(15) AS 'ConvertedValue';
Примечание.
Скалярные функции недоступны в бессерверных SQL-пулах.
В. Создание встроенной табличной функции
Следующий пример создаёт встроенную функцию со значением таблицы, которая возвращает ключевую информацию о модулях, фильтруя по параметру objectType . Он включает значение по умолчанию для возврата всех модулей при вызове функции с параметром DEFAULT . В этом примере используются некоторые из представлений системных каталогов, упомянутых в метаданных.
CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
SELECT
sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.definition AS 'Module Description'
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type like '%' + @objectType + '%'
);
GO
Вы можете вызвать функцию для возврата всех объектов view (V) с помощью следующих видов:
select * from dbo.ModulesByType('V');
Примечание.
Встроенные функции table-value доступны в серверных SQL-пулах, но в предварительном просмотре в выделенных SQL-пулах.
С. Объединение результатов встроенной табличной функции
Этот простой пример использует ранее созданный встроенный TVF, чтобы показать, как можно комбинировать его результаты с другими таблицами с CROSS APPLYпомощью . В этом примере вы выбираете все столбцы из обоих sys.objects и результаты для ModulesByType всех строк, совпадающих в столбце type . Для получения дополнительной информации о использовании APPLYсм. пункт FROM плюс JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Примечание.
Встроенные функции table-value доступны в серверных SQL-пулах, но в предварительном просмотре в выделенных SQL-пулах.