和C语言、Java、Python等一样,数据库也可以自定义函数,同样可以传参,拥有返回值。在工作中可能会遇到一些业务,需要反复执行某些sql,可以自定义一个函数,非常的方便。当然,还有很多业务可以用自定义函数快速完成。
--标量函数
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
SQL
个人没有遇到相关需要修改函数的业务场景。 只需把创建语句的 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%');
SQL
函数名之后的是 RETURNS 调用函数加上模式名
exec sp_helptext 函数名