/*
存储过程知识复习
存储过程在业界以前常常作为衡量程序员水平的标准,大虾们喜欢吹嘘自己写过几千行的存储过程,但是现在作为
java程序员,此功能被弱化,因为java程序讲究的是与具体的数据库相分离,但是作为.net程序员,依然要掌握好
此知识
PROCEDURE 也可以简写成 proc
创建存储过程语法
CREATE PROCEDURE 存储过程名
参数列表
--输入参数 按值传递 (参数也可以给默认值)
--输出参数 按引用传递
@参数名 数据类型 output --有output关键字就是输出参数
@参数名 数据类型 --没有output关键字就是输入参数
@参数名 数据类型 [output] --如果是输出参数的话,在创建存储过程的时候需要加output关键字进行声明,输入参数不需要加output关键字
as
T-SQL编程,定义变量,流程控制,循环等等
GO
调用存储过程
execute 存储过程名称,execute 可以简写成exec
调用存储过程的时候,如果在创建存储过程的时候有输出参数,那么在调用的时候也需要使用output关键字
*/
--
/*
创建无参数的存储过程
*/
--
CREATE PROCEDURE test2
AS
SELECT * FROM student
GO
--调用存储过程
EXECUTE test2
GO
/*
创建带输入参数的存储过程
*/
CREATE PROCEDURE test3
@age INT,
@myScore INT
AS
PRINT '传进来的参数age = ' + CONVERT(VARCHAR(4), @age)
PRINT '传进来的参数myScore = ' + CAST(@myScore AS VARCHAR(4))
SET @age = @age + 10
SET @myScore = @myScore + 5
PRINT '修改后的参数age = ' + CONVERT(VARCHAR(4), @age)
PRINT '修改后的参数myScore = ' + CAST(@myScore AS VARCHAR(4))
GO
/*
调用存储过程
*/
--第一种方式调用(建议使用这种方式调用)
EXECUTE test3 @age = 6,@myScore = 8
--第二种方式调用(不建议用这种方式调用)
EXEC test3 6,8
--
DECLARE @a INT --变量名字也可以叫@age,但是为了和存储过程中的参数名区分,最好不要取和存储过程中的参数名一样的名字
DECLARE @b INT --变量名字也可以叫@myScore,但是为了和存储过程中的参数名区分,最好不要取和存储过程中的参数名一样的名字
SET @a = 6
SET @b = 8
--EXEC test3 @a,@b
PRINT '-----------------我是忧伤的分割线-----------------'
EXEC test3 @age = @a,@myScore = @b
PRINT '----------调用完test3存储过程之后-------------------'
PRINT @a
PRINT @b
GO
/*
测试存储过程的按值和按引用传递
调用之后,可以看出,输入参数是按值传递的,因为调用完之后,值没有改变
调用之后,可以看出,输出参数是按引用传递的,因为调用完之后,值改变了
*/
/*
创建带输入参数,输出参数的存储过程
调用之后,可以看出,输入参数是按值传递的,因为调用完之后,值没有改变
调用之后,可以看出,输出参数是按引用传递的,因为调用完之后,值改变了
*/
ALTER PROCEDURE test4
@age INT, --输入参数按值传递
@myScore INT OUTPUT --输出参数按引用传递
--输入参数 按值传递 (参数也可以给默认值)
--输出参数 按引用传递
AS
PRINT '传进来的参数age = ' + CONVERT(VARCHAR(4), @age)
PRINT '传进来的参数myScore = ' + CAST(@myScore AS VARCHAR(4))
SET @age = @age + 10
SET @myScore = @myScore + 5
PRINT '修改后的参数age = ' + CONVERT(VARCHAR(4), @age)
PRINT '修改后的参数myScore = ' + CAST(@myScore AS VARCHAR(4))
GO
--
DECLARE @userAge INT
DECLARE @userScore INT
SET @userAge = 5
--SET @userScore = 13
EXECUTE test4 @age = @userAge,@myScore = @userScore OUTPUT
PRINT @userAge
PRINT @userScore
--
PRINT '-----------------我是忧伤的分割线-----------------'
EXECUTE test4 @userAge,@userScore OUTPUT
PRINT '-----------------我是忧伤的分割线-----------------'
EXECUTE test4 @userAge,@myScore = @userScore OUTPUT
PRINT '-----------------我是忧伤的分割线-----------------'
/*
调用存储过程的时候需要注意的点
注意点:1.最好使用这种方式 EXECUTE 存储过程名 @输入参数名称1 = 值1,@输出参数名称2 = 值2 output
2.也可以这样调用存储过程 EXECUTE 存储过程名 值1,值2 output
3.也可以这样调用存储过程 EXECUTE 存储过程名 值1,@输出参数名称2 = 值2 output
4.但是不可以这样调用存储过程 EXECUTE 存储过程名 @输入参数名称1 = 值1, 值2 output
5.如果调用存储过程的时候有多个参数的话,如果第一个参数你使用@输入参数名称1 = 值1 这样的形式的话,后面的所
有参数都必须按照@参数名称 = 值这样的形式传递
6.所以调用存储过程要么就这样调用(EXECUTE 存储过程名 @输入参数名称1 = 值1,@输出参数名称2 = 值2 output ),要么就这
样调用(EXECUTE 存储过程名 值1,值2 output),这2种调用方式比较一致和规范,但是还是建
议使用(EXECUTE 存储过程名 @输入参数名称1 = 值1,@输出参数名称2 = 值2 output )这样的方式调用,这种方式比
较好,参数名1=值1,参数名2=值2看起来比较清晰,一一对应,不容易把参数传错。
*/
--EXECUTE test4 @age = @userAge,@userScore OUTPUT --不能这样调用,语法不允许
PRINT '-------------------调用完test4存储过程之后-------------------'
PRINT @userAge
PRINT @userScore
/*
带默认值的存储过程
*/
CREATE PROCEDURE test5
@age INT = 20, --输入参数按值传递,有默认值
@myScore INT OUTPUT --输出参数按引用传递
--输入参数 按值传递 (参数也可以给默认值)
--输出参数 按引用传递
AS
PRINT '传进来的参数age = ' + CONVERT(VARCHAR(4), @age)
PRINT '传进来的参数myScore = ' + CAST(@myScore AS VARCHAR(4))
SET @age = @age + 10
SET @myScore = @myScore + 5
PRINT '修改后的参数age = ' + CONVERT(VARCHAR(4), @age)
PRINT '修改后的参数myScore = ' + CAST(@myScore AS VARCHAR(4))
GO
--
DECLARE @userAge INT
DECLARE @userScore INT
SET @userAge = 5
SET @userScore = 13
--
EXECUTE test5 @myScore = @userScore OUTPUT
PRINT @userAge
PRINT @userScore
PRINT '-----------------我是忧伤的分割线-----------------'
EXECUTE test5 @age = @userAge,@myScore = @userScore OUTPUT
PRINT '-------------------调用完test5存储过程之后-------------------'
PRINT @userAge
PRINT @userScore