简介
和C语言、Java、Python等一样,数据库也可以自定义函数,同样可以传参,拥有返回值。在工作中可能会遇到一些业务,需要反复执行某些sql,可以自定义一个函数,非常的方便。当然,还有很多业务可以用自定义函数快速完成。
讲解
函数分类
- 标量函数
标量函数返回一个确定类型的标量值,其返回值类型为除TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP和TABLE类型外的其它数据类型。函数体语句定义在BEGIN-END语句内。在 RETURNS 子句中定义返回值的数据类型,并且函数的最后一条语句必须为Return语句。 - 内联表值函数
内联表值型函数以表的形式返回一个返回值,即它返回的是一个表。内联表值型函数没有由BEGIN-END 语句括起来的函数体。其返回的表是由一个位于 RETURN 子句中的 SELECT 命令从数据库中筛选出来。内联表值型函数功能相当于一个参数化的视图。 - 多语句表值函数
多语句表值函数可以看作标量函数和内联表值函数的结合体。它的返回值是一个表,但它和标量型函数一样有一个用 BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。由此可见,它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值函数的不足。
创建语句
--标量函数
CREATE FUNCTION function_name(@parameter_name parameter_data_type)
--CREATE FUNCTION 函数名称(@参数名 参数的数据类型)
RETURNS date_type --返回返回值的数据类型,注意是 RETURNS
[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密
[AS]
BEGIN
function_body --函数体(即 Transact-SQL 语句)
RETURN 表达式;
--内联表值函数
CREATE FUNCTION function_name(@parameter_name parameter_data_type)
--CREATE FUNCTION 函数名称(@参数名 参数的数据类型)
RETURNS table --返回一个表(类似视图,无须指定列)
[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密
[AS]
RETURN 一条查询SQL语句
--多语句表值函数
CREATE FUNCTION function_name(@parameter_name parameter_data_type)
--CREATE FUNCTION 函数名称(@参数名 参数的数据类型)
RETURNS @Table_Variable_Name table (Column_1 culumn_type,Column_2 culumn_type)
--RETURNS @表变量 table 表的定义(即列的定义和约束)
[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密
[AS]
BEGIN
函数体(即 Transact-SQL 语句)
RETURN
修改语句
个人没有遇到相关需要修改函数的业务场景。
只需把创建语句的 create 改为 alter 即可。
删除语句
drop function 函数名
实例
--示例表test
CREATE TABLE test(
column_one VARCHAR(128) null,
column_two VARCHAR(128) null,
column_three VARCHAR(128) NULL
)
--插入数据
INSERT INTO test VALUES('column_one_1','column_two_1','column_three_1');
INSERT INTO test VALUES('column_one_2','column_two_2','column_three_2');
INSERT INTO test VALUES('column_one_3','column_two_3','column_three_3');
--查询一下数据
SELECT * FROM test;
--创建标量函数scalar_valued_functions
CREATE FUNCTION scalar_valued_functions(@in varchar(128))
RETURNS VARCHAR(128)
AS
BEGIN
DECLARE @out VARCHAR(128)
SELECT @out=column_two FROM test WHERE column_one=@in
RETURN @out
END
--调用函数,注意加上模式名(dbo),查询结果(column_two_2)
SELECT dbo.scalar_valued_functions('column_one_2');
--删除标量函数scalar_valued_functions。
DROP FUNCTION dbo.scalar_valued_functions;
--创建多参数标量函数,
CREATE FUNCTION scalar_valued_functions(@in varchar(128), @var2 VARCHAR(128))
RETURNS VARCHAR(128)
AS
BEGIN
DECLARE @out VARCHAR(128)
SELECT @out=column_two,@var2=column_three FROM test WHERE column_one=@in
RETURN @out+@var2
END
--调用多参数标量函数scalar_valued_functions,查询结果(column_two_2column_three_2)
SELECT dbo.scalar_valued_functions('column_one_2','');
--创建内联表值函数inline_table_values_function
CREATE FUNCTION inline_table_values_function(@var VARCHAR(128))
RETURNS TABLE
AS
RETURN SELECT column_two,column_three FROM test WHERE column_one LIKE @var
--调用内联表值函数,查询结果(test表第二列和第三列)
SELECT * FROM inline_table_values_function('column_one%');
--创建多语句表值函数multi_statement_table_value_function
CREATE FUNCTION multi_statement_table_value_function(@var VARCHAR(128))
RETURNS @table_test TABLE(first_column VARCHAR(128),second_column VARCHAR(128))
AS
BEGIN
INSERT INTO @table_test(first_column,second_column) SELECT column_two,column_three FROM test WHERE column_one LIKE @var
RETURN
END
--调用多语句表值函数,查询结果(test表第二列和第三列)
SELECT * FROM multi_statement_table_value_function('column_one%');
结束语
注意
函数名之后的是 RETURNS
调用函数加上模式名
查询自定义函数的函数体
exec sp_helptext 函数名
ALTER function createkbh(@lph varchar(50))
returns varchar
as
begin
return (@lph);
end
就这个函数,我参数输入abcd,就给我返回a,
在 Microsoft SQL Server(MSSQL)中,"varchar" 是一种可变长度的字符数据类型。从SQL Server 2016版本开始,默认长度为1个字符。这意味着如果在创建表时未指定具体长度,则 "varchar" 字段默认长度为1。当然,您可以根据需要显式地指定更大的长度。请注意,在不同的版本和配置下,可能会有不同的默认设置,因此建议查阅相关文档或手册以获取准确的信息。
仔细看我写的实例,returns varchar(50),varchar要写长度。
谢谢博主了,,我昨天看了你的实例,特意加上了长度,可能当时我忘记保存了,昨天就没生效,今天加上长度之后就好用了。
为啥我返回值一直都是首位字符啊?就最简单的一个函数,返回固定字符串,就是一直返回首位
把代码发出来呀