Изменение определяемых пользователем функций
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Вы можете изменить определяемые пользователем функции в SQL Server с помощью SQL Server Management Studio или Transact-SQL. Изменение определяемых пользователем функций, как описано ниже, не изменяет разрешения функций и не влияет на зависимые функции, хранимые процедуры или триггеры.
ограничения
ALTER FUNCTION нельзя использовать для выполнения следующих действий:
Преобразование скалярной функции в функцию с табличным значением или наоборот.
Преобразование встроенной функции в функцию из нескольких инструкций или наоборот.
Преобразование функции Transact-SQL в функцию CLR или наоборот.
Разрешения
Требует разрешения ALTER для функции или для схемы. Если в функции указан определяемый пользователем тип, требуется разрешение EXECUTE на этот тип.
Использование SQL Server Management Studio
Выберите знак плюса рядом с базой данных, содержащей функцию, которую вы хотите изменить.
Выберите знак плюса рядом с папкой Programmability .
Выберите знак плюса рядом с папкой, содержащей функцию, которую вы хотите изменить:
Table-valued Function
Скалярная функция
Агрегатная функция
Щелкните правой кнопкой мыши функцию, которую нужно изменить, и выберите пункт Изменить.
В окне запроса внесите нужные изменения в инструкцию ALTER FUNCTION.
В меню "Файл" выберите "Сохранитьfunction_name".
Использование Transact-SQL
В обозреватель объектов подключитесь к экземпляру ядро СУБД.
На стандартной панели выберите пункт Создать запрос.
Скопируйте приведенные ниже примеры в окно запроса и нажмите кнопку Выполнить.
Следующий пример кода изменяет скалярную функцию.
-- Scalar-Valued Function USE [AdventureWorks2022] GO ALTER FUNCTION [dbo].[ufnGetAccountingEndDate]() RETURNS [datetime] AS BEGIN RETURN DATEADD(millisecond, -2, CONVERT(datetime, '20040701', 112)); END;
Следующий пример кода изменяет табличную функцию.
-- Table-Valued Function USE [AdventureWorks2022] GO ALTER FUNCTION [dbo].[ufnGetContactInformation](@PersonID int) RETURNS @retContactInformation TABLE ( -- Columns returned by the function [PersonID] int NOT NULL, [FirstName] [nvarchar](50) NULL, [LastName] [nvarchar](50) NULL, [JobTitle] [nvarchar](50) NULL, [BusinessEntityType] [nvarchar](50) NULL ) AS -- Returns the first name, last name, job title and business entity type for the specified contact. -- Since a contact can serve multiple roles, more than one row may be returned. BEGIN IF @PersonID IS NOT NULL BEGIN IF EXISTS(SELECT * FROM [HumanResources].[Employee] e WHERE e.[BusinessEntityID] = @PersonID) INSERT INTO @retContactInformation SELECT @PersonID, p.FirstName, p.LastName, e.[JobTitle], 'Employee' FROM [HumanResources].[Employee] AS e INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = e.[BusinessEntityID] WHERE e.[BusinessEntityID] = @PersonID; IF EXISTS(SELECT * FROM [Purchasing].[Vendor] AS v INNER JOIN [Person].[BusinessEntityContact] bec ON bec.[BusinessEntityID] = v.[BusinessEntityID] WHERE bec.[PersonID] = @PersonID) INSERT INTO @retContactInformation SELECT @PersonID, p.FirstName, p.LastName, ct.[Name], 'Vendor Contact' FROM [Purchasing].[Vendor] AS v INNER JOIN [Person].[BusinessEntityContact] bec ON bec.[BusinessEntityID] = v.[BusinessEntityID] INNER JOIN [Person].ContactType ct ON ct.[ContactTypeID] = bec.[ContactTypeID] INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = bec.[PersonID] WHERE bec.[PersonID] = @PersonID; IF EXISTS(SELECT * FROM [Sales].[Store] AS s INNER JOIN [Person].[BusinessEntityContact] bec ON bec.[BusinessEntityID] = s.[BusinessEntityID] WHERE bec.[PersonID] = @PersonID) INSERT INTO @retContactInformation SELECT @PersonID, p.FirstName, p.LastName, ct.[Name], 'Store Contact' FROM [Sales].[Store] AS s INNER JOIN [Person].[BusinessEntityContact] bec ON bec.[BusinessEntityID] = s.[BusinessEntityID] INNER JOIN [Person].ContactType ct ON ct.[ContactTypeID] = bec.[ContactTypeID] INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = bec.[PersonID] WHERE bec.[PersonID] = @PersonID; IF EXISTS(SELECT * FROM [Person].[Person] AS p INNER JOIN [Sales].[Customer] AS c ON c.[PersonID] = p.[BusinessEntityID] WHERE p.[BusinessEntityID] = @PersonID AND c.[StoreID] IS NULL) INSERT INTO @retContactInformation SELECT @PersonID, p.FirstName, p.LastName, NULL, 'Consumer' FROM [Person].[Person] AS p INNER JOIN [Sales].[Customer] AS c ON c.[PersonID] = p.[BusinessEntityID] WHERE p.[BusinessEntityID] = @PersonID AND c.[StoreID] IS NULL; END RETURN; END;