Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:конечная точка аналитики SQL и хранилище в Microsoft Fabric
CREATE FUNCTION
может создавать встроенные функции табличного значения и скалярные функции.
Примечание.
Скалярные определяемые пользователем функции — это предварительная версия в хранилище данных Fabric.
Это важно
В хранилище данных Fabric скалярные определяемые пользователем функции должны быть встроенными для использования с SELECT ... FROM
запросами в пользовательских таблицах, но вы по-прежнему можете создавать функции, которые не являются встроенными. Скалярные определяемые пользователем функции, которые не являются встроенными, работают в ограниченном количестве сценариев. Вы можете проверить, можно ли встраить 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), а затем присвоить ей значение длиннее трех символов, данные будут усечены до размера переменной, а инструкция INSERT или UPDATE завершится без ошибок.
parameter_data_type
Тип данных параметра. Для функций Transact-SQL поддерживаются все скалярные типы данных .
[ = по умолчанию ]
Значение параметра по умолчанию. Если определено значение default, то функция выполняется даже в том случае, если для данного параметра значение не указано.
Если параметр функции имеет значение по умолчанию, ключевое слово DEFAULT
должно быть указано при вызове функции для получения значения по умолчанию. Применение ключевого слова DEFAULT следует отличать от использования аргументов со значениями по умолчанию в хранимых процедурах, когда не указанный аргумент неявно принимает значение по умолчанию.
return_data_type
Возвращаемое значение скалярной функции, определяемой пользователем.
Для функций в хранилище данных Fabric разрешены все типы данных, за исключениемметки времениrowversion/. Некаларовые типы, такие как таблица , не допускаются.
function_body
Ряд операторов Transact-SQL.
В скалярных функциях function_body представляет собой ряд операторов Transact-SQL , которые вместе оценивают скалярное значение, которое может включать:
- Выражение одной инструкции
- Выражения с несколькими операторами (
IF/THEN/ELSE
иBEGIN/END
блоки) - Локальные переменные
- Вызовы встроенных функций SQL
- Вызовы других определяемых пользователем функций
-
SELECT
операторы и ссылки на таблицы, представления и встроенные функции с табличным значением
scalar_expression
Указывает скалярное значение, возвращаемое скалярной функцией.
select_stmt
SELECT
Одна инструкция, определяющая возвращаемое значение встроенной табличной функции. Для встроенной табличной функции нет текста функции; Таблица — это результирующий набор одной SELECT
инструкции.
ТАБЛИЦА
Указывает, что возвращаемым значением функции с табличным значением (TVF) является таблица. Функциям с табличным значением могут передаваться только константы и @local_variables.
В встроенных ТВФ (предварительная версия) возвращаемое значение TABLE определяется с помощью одной SELECT
инструкции. Встроенные функции не имеют соответствующих возвращаемых переменных.
<function_option>
В хранилище данных Fabric ключевые INLINE
ENCRYPTION
слова и EXECUTE AS
ключевые слова не поддерживаются.
Поддерживаемые варианты функций включают:
SCHEMABINDING
Указывает, что функция привязана к объектам базы данных, которые содержат ссылки на нее. Если аргумент SCHEMABINDING указан, нельзя изменить базовые объекты таким способом, который может повлиять на определение функции. Сначала нужно изменить или удалить само определение функции, чтобы удалить зависимости от объекта, который требуется изменить.
Привязка функции к ссылающимся на нее объектам удаляется в следующих случаях:
При удалении функции.
При изменении функции инструкцией ALTER, если не указан параметр SCHEMABINDING.
Функция может быть привязана к схеме только в том случае, если выполняются следующие условия.
Любые пользовательские функции, на которые ссылается данная функция, также привязаны к схеме.
Ссылки на объекты, на которые ссылается функция, используются с помощью имени, состоящего из двух частей.
В теле определяемых пользователем функций может содержаться ссылка только на встроенные функции и другие определяемые пользователем функции в той же базе данных.
Пользователь, выполнивший инструкцию
CREATE FUNCTION
, имеет разрешение REFERENCES на объекты базы данных, на которые ссылается функция.
Чтобы удалить SCHEMABINDING, используйте ALTER
.
ВОЗВРАЩАЕТ ЗНАЧЕНИЕ NULL ДЛЯ ВХОДНЫХ ДАННЫХ NULL | ВЫЗЫВАЕТСЯ ДЛЯ ВХОДНЫХ ДАННЫХ NULL
Задает OnNULLCall
атрибут скалярной функции. Если значение не указано, по умолчанию подразумевается, CALLED ON NULL INPUT
а тело функции выполняется даже в том случае, если NULL
передается в качестве аргумента.
Рекомендации
Если определяемая пользователем функция не создается с привязкой схемы, изменения, внесенные в базовые объекты, могут повлиять на определение функции и создать непредвиденные результаты при вызове. При создании функции рекомендуется указать
WITH SCHEMABINDING
предложение. Это обеспечит невозможность изменения объектов, на которые ссылается определение функции, если при этом не изменяется сама функция.Написание определяемых пользователем функций, которые должны быть встроенными. Дополнительные сведения см. в разделе Встраивание скалярных функций, определяемых пользователем.
Совместимость
Встроенные пользовательские функции с табличным значением
В встроенной табличной функции допускается только одна инструкция select.
Скалярные пользовательские функции
В скалярных функциях допустимы следующие инструкции с одиночным значением.
- Инструкции назначения
- Операторы control-of-Flow, кроме
TRY...CATCH
операторов -
DECLARE
операторы, определяющие локальные переменные данных
В теле функции с скалярным значением не поддерживаются следующие встроенные функции:
Скалярные определяемые пользователем функции нельзя использовать в запросе в пользовательской
SELECT ... FROM
таблице, если:- Тело UDF содержит вызов недетерминированной встроенной функции, см. детерминированные и недетерминированные функции.
- Текст UDF содержит общее табличное выражение (CTE).
- Тело UDF содержит многофакторный текст UDF за шесть
IF
--THEN
ELSE
блоков. - Текст UDF содержит цикл WHILE
- Тело UDF не может быть вложено из-за других причин. Дополнительные сведения см. в статье о требованиях к встраивание скалярных UDF.
Скалярные определяемые пользователем функции нельзя использовать в запросе при выполнении следующих функций:
- UDF вызывается непосредственно в предложении
GROUP BY
. - UDF вызывается непосредственно в предложении
ORDER BY
. - Вызов запроса имеет общее табличное выражение (CTE).
- UDF вызывается непосредственно в предложении
Рекурсивные скалярные определяемые пользователем функции не поддерживаются.
Запрос пользователя может завершиться ошибкой, если более 10 вызовов UDF выполняются в одном запросе.
В некоторых пограничных случаях сложность пользовательского запроса и текста UDF предотвращает встраивание, в этом случае скалярный UDF не встраивается, и запрос пользователя завершается ошибкой.
При использовании скалярного UDF в любом неподдерживаемом сценарии отображается сообщение об ошибке "
Scalar UDF execution is currently unavailable in this context.
"
Ограничения
Примечание.
Во время текущей предварительной версии ограничения могут быть изменены.
Определяемые пользователем функции не могут выполнять действия, изменяющие состояние базы данных.
Определяемые пользователем функции могут быть вложенными, то есть из одной функции может быть вызвана другая. Уровень вложенности увеличивается на единицу каждый раз, когда начинается выполнение вызванной функции и уменьшается на единицу, когда ее выполнение завершается. Определяемые пользователем функции в хранилище данных Fabric могут быть вложены до четырех уровней, если текст UDF ссылается на функцию таблицы или представления или встроенного табличного значения или до 32 уровней в противном случае. Превышение максимального уровня вложения приводит к сбою цепочки вызывающих функций.
Метаданные
В следующем разделе приводятся системные представления каталога, возвращающие метаданные об определяемых пользователем функциях.
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: отображает базовые объекты, на которые ссылается функция.
Разрешения
Члены роли администратора рабочей области Fabric, участника и участника могут создавать функции.
Встраивание скалярных пользовательских функций
Хранилище данных Microsoft Fabric использует скалярную структуру UDF для компиляции и выполнения определяемого пользователем кода распределенным образом. Скалярная встраивание UDF включена по умолчанию.
В то время как скалярная настройка UDF — это метод оптимизации производительности, который впервые появился в Microsoft SQL Server 2019 (15.0), в хранилище данных Fabric он определяет поддерживаемый набор сценариев. В хранилище данных Fabric скалярные определяемые пользователем функции автоматически преобразуются в скалярные выражения или скалярные вложенные запросы, которые заменяются в вызывающем запросе вместо оператора UDF.
Некоторый синтаксис T-SQL делает скалярный UDF нелинейным. Функции, содержащие WHILE
цикл, несколько RETURN
инструкций или вызов недетерминированной встроенной функции SQL (например GETUTCDATE()
, или GETDATE()
) не могут быть встроены. Дополнительные сведения см. в статье о требованиях к встраивание скалярных UDF.
Проверьте, можно ли встраить скалярную UDF
Представление sys.sql_modules
каталога содержит столбец is_inlineable
, указывающий, является ли UDF встроенным.
Свойство is_inlineable
является производным от проверки синтаксиса в определении UDF. Скалярный UDF не встраиваются до компиляции. Значение 1
указывает, что UDF является встроенным, а значение 0
указывает, что он не является встроенным. Если скалярный UDF является встроенным, он не гарантирует, что он всегда будет вложен при компиляции запроса.
Хранилище данных Fabric решает, следует ли использовать UDF (на запрос) в зависимости от общей сложности запроса.
Используйте следующий пример запроса, чтобы проверить, является ли скалярный 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
В. Объединение результатов встроенной табличной функции
В этом простом примере используется ранее созданная встроенная функция и показано объединение ее результатов с другими таблицами с помощью инструкции CROSS APPLY. Здесь мы выбираем все столбцы из sys.objects
обоих столбцов и результаты ModulesByType
всех строк, соответствующих столбцу type
. Дополнительные сведения об использовании применения см. в предложении 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) возвращают тип данных таблицы.
В системе платформы аналитики (PDW) возвращаемое значение должно быть скалярным (одним) значением.
В Azure Synapse Analytics
CREATE FUNCTION
можно возвращать таблицу с помощью синтаксиса встроенных табличных функций (предварительная версия) или возвращать одно значение с помощью синтаксиса скалярных функций.В бессерверных пулах SQL в Azure Synapse Analytics можно создавать встроенные функции табличного значения,
CREATE FUNCTION
но не скалярные функции.При помощи этой инструкции можно создать подпрограмму, которую можно повторно использовать следующими способами.
В инструкциях Transact-SQL, таких как
SELECT
В приложениях, вызывающих функцию.
В определении другой пользовательской функции.
Для определения ограничения CHECK на столбец.
Для замены хранимой процедуры.
Использование встроенной функции в качестве предиката фильтра для политики безопасности
Подсказка
Синтаксис в хранилище данных Fabric см. в версии CREATE FUNCTION для хранилища данных Microsoft Fabric.
Соглашения о синтаксисе 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 или UPDATE завершится без ошибок.
parameter_data_type
Тип данных параметра. Для функций Transact-SQL допускаются все скалярные типы данных, которые поддерживаются в Azure Synapse Analytics. Тип данных timestamp (rowversion) не поддерживается.
[ = по умолчанию ]
Значение параметра по умолчанию. Если определено значение default, то функция выполняется даже в том случае, если для данного параметра значение не указано.
Если параметр функции имеет значение по умолчанию, то для него должно быть указано ключевое слово DEFAULT для получения функцией значения по умолчанию. Применение ключевого слова DEFAULT следует отличать от использования аргументов со значениями по умолчанию в хранимых процедурах, когда не указанный аргумент неявно принимает значение по умолчанию.
return_data_type
Возвращаемое значение скалярной функции, определяемой пользователем. Для функций Transact-SQL допускаются все скалярные типы данных, которые поддерживаются в Azure Synapse Analytics. Тип данных метки времени rowversion/не поддерживается. Нескалярные типы курсора и таблицы не допускаются.
function_body
Ряд инструкций Transact-SQL.
Function_body не может содержать инструкцию SELECT
и не может ссылаться на данные базы данных. Function_body не может ссылаться на таблицы или представления. Аргумент function_body может вызывать другие детерминированные функции, но не может вызывать недетерминированные.
Для скалярных функций function_body представляет собой ряд инструкций Transact-SQL, совместное выполнение которых вычисляет скалярное выражение.
scalar_expression
Указывает скалярное значение, возвращаемое скалярной функцией.
select_stmt
SELECT
Одна инструкция, определяющая возвращаемое значение встроенной табличной функции. Для встроенной табличной функции нет текста функции; Таблица — это результирующий набор одной SELECT
инструкции.
ТАБЛИЦА
Указывает, что возвращаемым значением функции с табличным значением (TVF) является таблица. Функциям с табличным значением могут передаваться только константы и @local_variables.
В встроенных ТВФ (предварительная версия) возвращаемое значение TABLE определяется с помощью одной SELECT
инструкции. Встроенные функции не имеют соответствующих возвращаемых переменных.
<function_option>
Указывает, что функция имеет один или несколько следующих параметров.
SCHEMABINDING
Указывает, что функция привязана к объектам базы данных, которые содержат ссылки на нее. Если аргумент SCHEMABINDING указан, нельзя изменить базовые объекты таким способом, который может повлиять на определение функции. Сначала нужно изменить или удалить само определение функции, чтобы удалить зависимости от объекта, который требуется изменить.
Привязка функции к ссылающимся на нее объектам удаляется в следующих случаях:
При удалении функции.
При изменении функции инструкцией ALTER, если не указан параметр SCHEMABINDING.
Функция может быть привязана к схеме только в том случае, если выполняются следующие условия.
Любые пользовательские функции, на которые ссылается данная функция, также привязаны к схеме.
Функции и другие определяемые пользователем функции, на которые ссылается данная функция, указываются как одно- или двухкомпонентное имя.
В теле определяемых пользователем функций может содержаться ссылка только на встроенные функции и другие определяемые пользователем функции в той же базе данных.
Пользователь, выполнивший инструкцию
CREATE FUNCTION
, имеет разрешение REFERENCES на объекты базы данных, на которые ссылается функция.
Чтобы удалить SCHEMABINDING, используйте ALTER
.
ВОЗВРАЩАЕТ ЗНАЧЕНИЕ NULL ДЛЯ ВХОДНЫХ ДАННЫХ NULL | ВЫЗЫВАЕТСЯ ДЛЯ ВХОДНЫХ ДАННЫХ NULL
Задает OnNULLCall
атрибут скалярной функции. Если значение не указано, по умолчанию подразумевается, CALLED ON NULL INPUT
а тело функции выполняется даже в том случае, если NULL
передается в качестве аргумента.
Рекомендации
Если определяемая пользователем функция создан без применения предложения SCHEMABINDING, то изменения базовых объектов могут повлиять на определение функции и привести к непредвиденным результатам при вызове функции. При создании функции рекомендуется указать WITH SCHEMABINDING
предложение. Это обеспечит невозможность изменения объектов, на которые ссылается определение функции, если при этом не изменяется сама функция.
Совместимость
В скалярных функциях допустимы следующие инструкции с одиночным значением.
Инструкции присваивания.
Инструкции управления потоком, за исключением инструкций TRY...CATCH.
Инструкции DECLARE, объявляющие локальные переменные.
Во встроенной функции с табличным значением (предварительная версия) допускается только одна инструкция SELECT.
Ограничения
Определяемые пользователем функции не могут выполнять действия, изменяющие состояние базы данных.
Определяемые пользователем функции могут быть вложенными, то есть из одной функции может быть вызвана другая. Уровень вложенности увеличивается на единицу каждый раз, когда начинается выполнение вызванной функции и уменьшается на единицу, когда ее выполнение завершается. Превышение максимального уровня вложенности приводит к ошибке выполнения для всей цепочки вызываемых функций. В хранилище данных Microsoft Fabric определяемые пользователем функции можно вложить до пяти уровней.
Объекты, включая функции, нельзя создавать в 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 и возвращает тип данных decimal(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
Затем функцию можно вызвать для возврата всех объектов представления (V
) с помощью:
select * from dbo.ModulesByType('V');
Примечание.
Встроенные функции, возвращающие табличные значения, доступны в бессерверных пулах SQL, но не доступны в предварительной версии в выделенных пулах SQL.
С. Объединение результатов встроенной табличной функции
В этом простом примере используется ранее созданная встроенная функция и показано объединение ее результатов с другими таблицами с помощью инструкции CROSS APPLY. Здесь мы выбираем все столбцы из sys.objects
обоих столбцов и результаты ModulesByType
всех строк, соответствующих столбцу type
. Дополнительные сведения об использовании применения см. в предложении FROM и JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Примечание.
Встроенные функции, возвращающие табличные значения, доступны в бессерверных пулах SQL, но не доступны в предварительной версии в выделенных пулах SQL.