今天第一次写mysql的存储过程,感觉跟sql server的区别还是蛮大的,包括参数的声明,及其本身自带一些函数。
因为本人 是个菜鸟,所以就今天的例子中的不同自己稍微写写,加深自己的印象。
1、输入输出参数声明的不同:mysql 需要写在括号内,sql server 没有括号,并且参数名需要添加@;
2、declare声明变量,mysql每一个变量都需要添加declare,名字尽量不要跟列名相同,并且每一句都要以分号结束;sql server只需要一个declare,参数名之间逗号隔开,注意,参数名要加@。
3、给变量赋值:
mysql有两种方式:set 变量名=值 或者 select 列明 into 变量名
sql server可以使用set赋值,但是通过select 可以直接select 参数名= 列明 from 表获取值。
4、函数
两个不同的数据库函数差距还是很大的,
本例中用的是 求长度 mysql 为LENGTH(),sql server 可以使用len();
还是就是字符串拼接,mysql 字符串拼接需要使用函数CONCAT(),而sql server 可以用+进行字符串拼接,例如:2015+''+01;
下面是sql代码:
paper 表:
CREATE table paper (
ym varchar(15),
paperno int
)
//mysql 生成编号存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS `getPaper`
CREATE getPaper (OUT paper VARCHAR(20))
BEGIN
DECLARE ymd VARCHAR(20);
DECLARE nowDate VARCHAR(20);
DECLARE paperno1 VARCHAR(20);
SET nowDate = DATE_FORMAT(NOW(),'%Y%m%d');
SELECT ym INTO ymd FROM paper;
IF ymd = nowDate THEN
SELECT paperno INTO paperno1 FROM paper;
UPDATE paper SET paperno=paperno1+1;
ELSE
UPDATE paper SET ym = nowDate,paperno = 1 ;
END IF ;
SELECT paperno INTO paperno1 FROM paper ;
IF LENGTH(paperno1) = 1 THEN SET paperno1 = CONCAT('00',paperno1); END IF;
IF LENGTH(paperno1) = 2 THEN SET paperno1 = CONCAT('0',paperno1); END IF;
SET paper=CONCAT(nowDate,paperno1) ;
END$$
DELIMITER ;
//sqlserver 存储过程
CREATE Proc [dbo].[getPaper]
@paper varchar(20) output --输出
AS
Declare @date datetime,
@month varchar(2),
@day varchar(2),
@now varchar(8),
@ym varchar(8),
@paperno varchar(10)
select @date = getdate() --得到当前日期
select @month = convert(varchar(4),datepart(month,@date))
if len(@month) = 1 set @month = '0' + @month --得到月份并修改为2位
select @day=convert(varchar(4),datepart(day,@date))
if len(@day) = 1 set @day = '0' + @day
select @now = convert(varchar(4),datepart(year,@date)) + @month + @day --得到年份和月份的连接字符串
select @ym=ym from paper --得到数据库中的年份和月份连接的字符串
if (@now = @ym)
update paper set paperno=paperno+1 --如果当前年月和数据库中相同,就让流水号加1
else
update paper set ym = @now,paperno = 1 --否则,改变当前年月值,改变流水号为1
select @paperno=paperno from paper
if len(@paperno) = 1 set @paperno = '00' + @paperno --流水号处理
if len(@paperno) = 2 set @paperno = '0' + @paperno
select @paper=(@now + '' + @paperno) --设置输出