UDF—MSQL Server 2000的新特性

UDF—MSQL Server 2000的新特性,第1张

本文将介绍Microsoft SQL Server 的新增特性—用户自定义函数User Defined Function(UDF) 并演示几个常用的实例 UDF的功能类似SQL Server中内建的系统函数 如CONVERT SUBSTRING DATAADD GETDATA ISNULL等等 一个UDF可以没有参数 或者带有一个或多个参数 函数运行后将会返回一个函数值 定义UDF的语法如下 CREATE FUNCTION [ owner_name ] function_name ( { { @parameter_name scalar_parameter_data_type [ …n] ] ) RETURN scalar_return_data_type [WITH <function_option>[ … n]] [AS] BEGIN Function_body RETURN scalar_expression END 每个UDF可以带有 个到 个参数 每个参数可以是除了timestamp cursor table 以外所有的数据类型 函数返回值的限制要更多一些 它不可以是text ntext image timestamp cursor和table 函数体是UDF的主要部分 它有两个选项: ENCRYOTION和 SCHEMABINDING SCHEMABINDING是SQL Server 的新增功能 可以和视图一同使用 该选项不允许删除和修改被该函数引用的对象 这样可以防止无效的函数和视图对它们引用的对象进行结构上的修改 大家会注意到函数体以Begin开始 End结束 这一点不同于创建存储过程 触发器和视图 当您忘了写上Begin/End时 系统会返回一个提示信息 Incorrect syntax near RETURN 为什么不直接说少了Begin/End 这有点让人费解 下面我用几个例子来说明UDF的应用 Greatest and Least 为了区别于系统函数Max和Min 我给新函数命名为Greatest和Least 它们会从以参数形式输入的两个值中找出最大值和最小值 Case语句是两个函数的核心 CASE WHEN value >value THEN value ELSE value END 虽然函数很简单 但用途是很广的 CREATE FUNCTION dbo Greatest Return the maximum of o parameters (@Val SQL_VARIANT @Val SQL_VARIANT) RETURNS SQL_VARIANT AS BEGIN RETURN (CASE WHEN @val >@val THEN @val ELSE @val END) END go ――――――――――――――――――――――――――――――― CREATE FUNCTION dbo Least Return the minimum of o parameters ( @val SQL_VARIANT @val SQL_VARIANT ) RETURNS SQL_VARIANT AS BEGIN RETURN (CASE WHEN @val <@val THEN @val ELSE @val END) END Go 大小写转换函数 该函数有两个参数 @String和@Capitalize_What 依据 @Capitalize_What的值 函数有不同的功能 ¨ @Capitalize_What = string 函数将 @string的第一个非空字符转换成大写 其余部分改为小写 ¨ @Capitalize_What = sentence 函数将 @string中的每一句的首个非空字符转换为大写 句子其余部分转换为小写 断句的依据是 ! ? ¨ @Capitalize_What = word 函数将 @string中的每个词都转换成首字符大写 其余小写的形式 CREATE FUNCTION dbo Capitalize ( Capitalize the first character of every word sentence or the whole string Put the rest to lowercase @String VARCHAR ( ) @Capitalize_What VARCHAR ( ) = string String: Capitalize the first letter of the string Sentence: Capitalize the first letter of every sentence Delimiters: /!/? Word: Capitalize the first letter of every word Delimiters: any characters other than letters and digits ) RETURNS VARCHAR( ) AS BEGIN DECLARE @Position SMALLINT @Char CHAR( ) @First_Char CHAR ( ) @Word_Start SMALLINT SET @Capitalize_What = LOWER( @Capitalize_What ) SET @Word_Start = IF @Capitalize_What IN ( word sentence ) BEGIN SET @Position = DATALENGTH( @String ) WHILE @Position >= BEGIN SET @Char = CASE @Position WHEN THEN ELSE UPPER( SUBSTRING( @String @Position ) ) END IF @Char BEEEN A AND Z OR @Char BEEEN and BEGIN SET @Word_Start = @Position SET @First_Char = UPPER( @Char ) END ELSE BEGIN IF @Capitalize_What = word OR @Char in ( ! ? ) BEGIN IF @Word_Start >AND @First_Char BEEEN A AND Z SET @String = STUFF( @String @Word_Start @First_Char ) SET @Word_Start = END END SET @Position = @Position END END ELSE BEGIN Capitalize the first character SET @Position = WHILE @Position <DATALENGTH( @String ) BEGIN SET @Position = @Position + SET @Char = UPPER( SUBSTRING( @String @Position ) ) IF @Char BEEEN A AND Z OR @Char BEEEN AND BEGIN SET @String = STUFF( @String @Position @Char ) SET @Position = END END END RETURN( @String ) END go 小结 SQL Server 的 UDF的应用是很广泛的 它会给编程人员带来极大的便利 您可以建立自己的 system UDF 存在Master数据库中 可以为任何数据库进行调用 UDF也有不足 我们知道系统函数可以任意调有 不管您使用大写 小写或者大小写混合 UDF却不行 它是大小写敏感的 在未来的版本中 我希望微软为UDF增加默认值的功能 以后我们可以这样定义一个函数 CREAT FUNCTION dbo Test_default ( @parm int = ) RETURN INT AS BEGIN RETURN ( @parm ) END UDF中诸如此类的小问题还有不少 希望UDF的功能越来越强大 我们编程人员工作起来就会越来越轻松 lishixinzhi/Article/program/SQLServer/201311/22014

背景

在上一篇推文中,我们介绍了 MySQL Group Replication 8.0.16 支持信息碎片化功能来增强大型事务处理能力。

如果您想在组复制中使用该功能,则任何组成员的版本都不能低于 8.0.16!

简单地说就是由于低版本协议上不支持。MySQL 8.0.16 的组通讯开始支持新协议,简称“分段协议”,之前的版本中只有一种“压缩协议”。

如果多个成员想加入复制组,那么在协议匹配上遵循以下原则:

现有复制组成员和新加入成员版本相同,加入成功。

低版本成员想加入高版本的组会被驱逐,加入失败。

高版本的成员想加入低版本的组,单独加入成功,多个加入失败。

例如:

一个 MySQL Server 8.0.16 实例可以成功加入使用通信协议版本 5.7.24 的组。

一个 MySQL Server 5.7.24 实例无法成功加入使用通信协议版本 8.0.16 的组。

两个 MySQL Server 8.0.16 实例无法同时加入使用通信协议版本 5.7.24 的组。

两个 MySQL Server 8.0.16 实例可以同时加入使用通信协议版本 8.0.16 的组。

新增 UDF

为了能让高版本的复制组更便于加入低版本的成员,MySQL 8.0.16 新增两个 UDF。

您可以使用两个新的 UDF 命令去管理组通信协议:

1. group_replication_set_communication_protocol(new_protocol)

设置组复制通讯协议版本

SELECT group_replication_set_communication_protocol("8.0.15")

填入一个所有成员都支持的版本号,即:new_protocol ≤ 所有成员的 MySQL版本。

new_protocol 格式:major.minor.patch (主版本号.次版本号.发布版本号)例如:8.0.15。

2. group_replication_get_communication_protocol()

获取复制中最旧成员的 MySQL 版本号

SELECT group_replication_get_communication_protocol()   +------------------------------------------------+    | group_replication_get_communication_protocol() |    +------------------------------------------------+    | 5.7.14                                         |    +------------------------------------------------+

获取的版本号可能与设置的值不一致,但不一致的版本之间组复制协议是一样的。

返回结果格式:major.minor.patch (主版本号.次版本号.发布版本号)例如:8.0.15。

以上两个 UDF 对全部组成员有效,主机或从机上均可执行。

结论

若想使用信息碎片功能。建议将组复制成员全部升级为 8.0.16。

若组内成员版本仅有部分为 8.0.16,可以用两个新的函数来让高版本的成员保持与其它成员组协议一致。

请点击输入图片描述


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6696773.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存