修改标量值函数注意事项

更改先前通过执行 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 [架构名].函数名称;

示例:

--声明数据库引用

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之修改标量值函数相关推荐

  1. Sqlserver将人名转换为拼音函数

    Sqlserver 将人名转换为拼音函数 调用方法: select [dbo].[procGetPinYin]('姓名') as Name 函数代码: create function [dbo].[p ...

  2. oracle判断值是否为0的高数,SQLServer和Oracle的常用函数对比

    数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) ...

  3. 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

    文章目录 一.判定指针合法性 二.数组越界 三.不断修改指针变量值 四.函数中将栈内存数组返回 五.函数间接赋值形参操作 六.指针取值与自增操作 一.判定指针合法性 判定指针合法性时 , 必须进行如下 ...

  4. 数据库(SQLServer)存储过程(PROCEDURE) 函数(function)

    数据库(SQLServer)基本语法 1)存储过程2)函数模拟场景:某所高中学校的一套内部管理系统,设有学生管理,班级管理,教师管理,教室管理以及课程管理以下例子为教师管理. 表管理说明:①Teach ...

  5. 【PowerBI】各种常用度量值函数以及创建日历表

    近期在统计日活量和月活量,要求日活量和月活量为访问量去重的数据,且数据不会根据筛选器的开始日期而变动,另外还有计算月累计,季度累计,年累计等,下面为用到的些度量值及其函数 1.创建日历表 //根据lo ...

  6. SqlServer列转行查询--Pivot函数

    下面来说说SQLServer 中常用Pivot 函数(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好) 让我们先从一个虚构的场景中来着手吧 万国来朝,很多供应商每天都汇报各 ...

  7. 数据库:SQLServer中in和 exists函数用法笔记

    今天给大家分享一下SQLServer中in和 exists 用法,希望能对大家有所帮助. 一.IN 用法 确定指定的值是否与子查询或列表中的数据相匹配. 1.1 语法格式 test_expressio ...

  8. oracle中的convert函数,SQLServer中ISNULL和CONVERT函数

    create view sss as(select ISNULL(operate_time, CONVERT(VARCHAR(20),create_time,120)) time from s_pro ...

  9. android5.0后新特性修改标题头,Android5.0中Material Design的新特性

    Material Design简介 Material Design是谷歌新的设计语言,谷歌希望寄由此来统一各种平台上的用户体验,Material Design的特点是干净的排版和简单的布局,以此来突出 ...

最新文章

  1. 推荐一款高端大气上档次的在线作图工具
  2. python struct
  3. 数字转换成字符串进行连接
  4. 2019中韩版权研讨会举行 网络成版权保护主战场
  5. pycharm安装scrapy失败_Scrapy ——环境搭配与一个简单的例子
  6. loadrunner 关联匹配多个值
  7. 排序算法之----快速排序(快速上手快速排序)
  8. php csrf攻击 xss区别,XSS与CSRF攻击及防御方法
  9. Django 框架篇(七) : 中间件 以及 5种方法
  10. 中国家禽细菌学诊断行业市场供需与战略研究报告
  11. 《原力计划【第二季】》第 3 周周榜揭晓!!!
  12. Eight Queens UVa 750
  13. python—day01_环境安装
  14. 1个app的完整测试用例_同你分享1个完整的聚类分析案例
  15. 高等代数——大学高等代数课程创新教材(丘维声)——3.8笔记+习题
  16. 数据挖掘技术-绘制人口数目直方图
  17. 为什么程序员喜欢这些键盘?
  18. 在微信里接收文件后如何指着文件用咱编的APP打开?
  19. ArchLinux安装AUR助手 yaourt
  20. s3fs挂载对象存储到本地

热门文章

  1. Kafka必须掌握的核心技术:Java基础入门期末考试
  2. Java多线程面试题总结,Java岗
  3. JAVA day27,28 线程池
  4. 无法完成您的itunes store的请求_iTunes 谢幕,盘点它的这 18 年
  5. linux qt 系统时间,QT在linux环境下读取和设置系统时间
  6. java冒泡怎么写_java 冒泡 又一种写法
  7. java软尾山地车评测_[渣图] 骑很慢的穷屌丝软尾历程
  8. mysql 缓存优缺点_MySQL查询缓存的优缺点
  9. vue中动态指令参数
  10. php sql 字段不能为空值,关于php:Sudden SQL问题-一般错误:1364字段没有默认值