SQLServer之修改标量值函数
修改标量值函数注意事项
更改先前通过执行 CREATE FUNCTION 语句创建的现有 Transact-SQL 或 CLR 函数,但不更改权限,也不影响任何相关的函数、存储过程或触发器。
不能用 ALTER FUNCTION 将标量值函数更改为表值函数。反之亦然。
不能使用 ALTER FUNCTION 将 Transact-SQL 函数更改为 CLR 函数。反之亦然。
需要对函数或架构具有 ALTER 权限。 如果函数指定用户定义类型,则需要对该类型具有 EXECUTE 权限。
SSMS数据库管理工具修改标量值函数语法和T-SQL脚本修改标量值函数语法相同。
下列 Service Broker 语句不能包含在 Transact-SQL 用户定义函数的定义中:
- BEGIN DIALOG CONVERSATION
- END CONVERSATION
- GET CONVERSATION GROUP
- MOVE CONVERSATION
- RECEIVE
- SEND
使用T-SQL脚本修改标量值函数
语法:
--声明数据库引用
use 数据库名;
go
--修改标量值函数
alter function [schema_name.] function_name
(@parameter_name [as] [type_schema_name.] parameter_data_type [ = default ] [ readonly],..n)
returns return_data_type
[with] [encryption][,][schemabinding][,][returns null on null input | called on null input][,][execute as Clause]
as
begin
function_body;
return scalar_expression;
end
go
语法解析:
--schema_name
--用户定义函数所属的架构的名称。
--function_name
--用户定义函数的名称。 函数名称必须符合标识符规则,并且在数据库中以及对其架构来说是唯一的,即使未指定参数,函数名称后也需要加上括号。
--@parameter_name
--用户定义函数中的参数。 可声明一个或多个参数。
--一个函数最多可以有 2,100 个参数。 执行函数时,如果未定义参数的默认值,则用户必须提供每个已声明参数的值。
--通过将 at 符号 (@) 用作第一个字符来指定参数名称。 参数名称必须符合标识符规则。 参数是对应于函数的局部参数;其他函数中可使用相同的参数名称。
--参数只能代替常量,而不能用于代替表名、列名或其他数据库对象的名称。
--[ type_schema_name. ] parameter_data_type
--参数的数据类型及其所属的架构,后者为可选项。 对于 Transact-SQL 函数,允许使用除 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型和用户定义表类型)。
--对于 CLR 函数,允许使用除 text、ntext、image、用户定义表类型和 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。 在 Transact-SQL 函数或 CLR 函数中,
--不能将非标量类型 cursor 和 table 指定为参数数据类型。
--如果未指定 type_schema_name, 数据库引擎会按以下顺序查找 scalar_parameter_data_type:
--包含 SQL Server 系统数据类型名称的架构。
--当前数据库中当前用户的默认架构。
--当前数据库中的 dbo 架构。
--[ =default ]
--参数的默认值。 如果定义了 default 值,则无需指定此参数的值即可执行函数。
--如果函数的参数有默认值,则调用该函数以检索默认值时,必须指定关键字 DEFAULT。 此行为与在存储过程中使用具有默认值的参数不同,在后一种情况下,不提供参数同样意味着使用默认值。
--但在通过使用 EXECUTE 语句调用标量函数时,DEFAULT 关键字不是必需的。
--readonly
--指示不能在函数定义中更新或修改参数。 如果参数类型为用户定义的表类型,则应指定 READONLY。
--return_data_type
--标量用户定义函数的返回值。 对于 Transact-SQL 函数,可以使用除 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。
--对于 CLR 函数,允许使用除 text、ntext、image 和 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。 在 Transact-SQL 函数或 CLR 函数中,不能将非标量类型 cursor 和 table 指定为返回数据类型。
--encryption
--适用范围: SQL Server 2008 到 SQL Server 2017。
--指示 数据库引擎会将 CREATE FUNCTION 语句的原始文本转换为模糊格式。 模糊代码的输出在任何目录视图中都不能直接显示。 对系统表或数据库文件没有访问权限的用户不能检索模糊文本。
--但是,可以通过 DAC 端口访问系统表的特权用户或直接访问数据库文件的特权用户可以使用此文本。 此外,能够向服务器进程附加调试器的用户可在运行时从内存中检索原始过程。
--使用此选项可防止将函数作为 SQL Server 复制的一部分发布。 不能为 CLR 函数指定此选项。
--schemabinding
--指定将函数绑定到其引用的数据库对象。 如果指定了 SCHEMABINDING,则不能按照将影响函数定义的方式修改基对象。 必须首先修改或删除函数定义本身,才能删除将要修改的对象的依赖关系。
--returns null on null input | called on null input
--指定标量值函数的 OnNULLCall 属性。 如果未指定,则默认为 CALLED ON NULL INPUT。 这意味着即使传递的参数为 NULL,也将执行函数体。
--如果在 CLR 函数中指定了 RETURNS NULL ON NULL INPUT,它指示当 SQL Server 接收到的任何一个参数为 NULL 时,它可以返回 NULL,而无需实际调用函数体。 如果 <method_specifier> 中指定的 CLR 函数的方法已具有指示 RETURNS NULL ON NULL INPUT 的自定义属性,
--但 CREATE FUNCTION 语句指示 CALLED ON NULL INPUT,则优先采用 CREATE FUNCTION 语句指示的属性。 不能为 CLR 表值函数指定 OnNULLCall 属性。
--execute as 子句
--对于本机编译的标量用户定义函数,EXECUTE AS 是必需的。
--SELF
--EXECUTE AS SELF 与 EXECUTE AS user_name 等价,其中指定用户是创建或更改模块的用户。 创建或更改模块的用户的实际用户 ID 存储在 sys.sql_modules 或 sys.service_queues 目录视图的 execute_as_principal_id 列中。
--OWNER
--指定模块内的语句在模块的当前所有者上下文中执行。 如果模块没有指定的所有者,则使用模块架构的所有者。 不能为 DDL 或登录触发器指定 OWNER。
--' user_name '
--指定模块内的语句在 user_name 指定的用户的上下文中执行。 将根据 user_name 来验证对模块内任意对象的权限。 不能为具有服务器作用域的 DDL 触发器或登录触发器指定 user_name。 请改用 login_name。
--user_name 必须存在于当前数据库中,并且必须是单一实例帐户。 user_name 不能为组、角色、证书、密钥或内置帐户,如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。
--执行上下文的用户 ID 存储在元数据中,可以在 sys.sql_modules 或 sys.assembly_modules 目录视图的 execute_as_principal_id 列查看。
--' login_name '
--指定模块内的语句在 login_name 指定的 SQL Server 登录的上下文中执行。 将根据 login_name 来验证对模块内任意对象的权限。 只能为具有服务器作用域的 DDL 触发器或登录触发器指定 login_name。
--login_name 不能为组、角色、证书、密钥或内置帐户,如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。
--function_body
--指定一系列定义函数值的 Transact-SQL 语句,这些语句在一起使用不会产生负面影响(例如修改表)。 function_body 仅用于标量函数和多语句表值函数。
--在标量函数中,function_body 是一系列 Transact-SQL 语句,这些语句一起使用可计算出标量值。
--在多语句表值函数中,function_body 是一系列 Transact-SQL 语句,这些语句将填充 TABLE 返回变量。
--scalar_expression
--指定标量函数返回的标量值。
语法调用:
select [架构名].[函数名称](参数值,...n);
示例:
--声明数据库引用
use testss;
go
--修改数据库
alter function [dbo].[noreferencepro1](@num1 int,@num2 int)
returns int
with encryption,schemabinding,called on null input,execute as self
as
begin
declare @sum int;
if @num1 is not null and @num2 is not null
set @sum=@num1+@num2;
else if @num1 is not null
set @sum=@num1;
else if @num2 is not null
set @sum=@num2;
else
set @sum=0;
return @sum;
end;
go
示例结果:依次显示修改结果和调用结果。

SQLServer之修改标量值函数的更多相关文章
- SQLServer与ASP中DATEDIFF函数区别
一.SQLServer: 格式: DATEDIFF(interval,startdate,enddate) interval参数: 年-yy,yyyy 季度-qq,q 月-mm,m 年中的日-dy,y ...
- sqlserver中,查看某个函数的调用情况
今天想在sqlserver中看看自己写的函数都被哪个函数或存储过程调用了,手工检查起来太慢了,于是在网上找一个快速的方法,分享一下. select * from sys.all_sql_modules ...
- sqlserver 和MySQL的一些函数的区别
相同的表数据在sqlserver和MySQL中使用各自的函数得到相同的结果,如下表 drop table tb;create table tb(id int, value1 varchar(10), ...
- SqlServer数据库字典--表.视图.函数.存储过程.触发器.主键.外键.约束.规则.sql
SELECT DISTINCT TOP 100 PERCENT isnull(p.name,'') AS 父对象, o.xtype, CASE o.xtype WHEN 'C' ...
- sqlserver常用日期、时间函数和格式
Sql Server中常用的日期与时间函数1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 ...
- SQLSERVER数据库中的 时间函数
一.sql server日期时间函数 Sql Server中的日期与时间函数 1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返 ...
- sqlserver批量导出存储过程、函数、视图
select text from syscomments s1 join sysobjects s2 on s1.id=s2.id where xtype = 'V' xtype V 视图 P ...
- sqlserver 汉字转拼音 索引 函数
IF OBJECT_ID('[fn_GetPinyin]') IS NOT NULL DROP FUNCTION [fn_GetPinyin] GO create function [dbo].[fn ...
- SQLServer中ISNULL和CONVERT函数
create view sss as(select ISNULL(operate_time, CONVERT(VARCHAR(20),create_time,120)) time from s_pro ...
随机推荐
- less环境的安装与搭建
less: Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充.Less 可以运行在 Node 或浏 ...
- Docker for windows : 安装Redis
一.拉取Redis镜像 docker pull hub.c..com/library/redis: 二.创建并运行Redis docker run -d -it --name redis d4f259 ...
- Zabbix通过IPMI监控HPE服务器硬件
IPMI是智能型平台管理接口(Intelligent Platform Management Interface)的缩写,是管理基于 Intel结构的企业系统中所使用的外围设备采用的一种工业标准,该标 ...
- [置顶]
xamarin android toolbar(踩坑完全入门详解)
网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...
- 网络设备配置与管理(华为)基础系列 :VLAN故障排除和GVRP
一.VLAN故障排除 故障排除的三步骤:故障定位 → 分析故障 → 排除故障 一般情况下,网络设备配置的故障有两种排错方式 A.静态排错:主要靠display查看配置信息的方式进行 在相关vlan下d ...
- RabbitMQ消息队列(六)-消息任务分发与消息ACK确认机制(.Net Core版)
在前面一章介绍了在.Net Core中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消费者消费同一个队列怎么办?如果这几个消费者分任务的权重不同怎么办?怎么把 ...
- springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用
百度百科: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBat ...
- Java基础之 数组详解
前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...
- Xamarin.Forms 开发资源集合(复制)
复制:https://www.cnblogs.com/mschen/p/10199997.html 收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 S ...
- C#如何发送邮件
准备工作: 1.开启Smtp服务 2.如果邮件设置中有“客户端授权码"(以163邮箱为例,有的邮箱不需要),需要开启“客户端授权码" 发送邮件: using (MailMessag ...
