mysql与SqlServer存储过程区别:
1、declare语句
mysql1)DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。
2)定义变量不需要在变量名前加‘@’符合
sqlServer
1)DECLARE可以定义在BEGIN ... END复合语句里,也可以定义在BEGIN语句之前
2)定义变量必须在变量名前加‘@’符号
2、IF语句
mysql
1)语法格式:
IF 条件表达式 THEN
语句;
ELSE
语句;
END IF;
SqlServer
1)语法格式:
IF 条件表达式
BEGIN
语句
END
ELSE
BEGIN
语句
END
3、使用select语句给变量赋值
mysql
Select语句查询列中的值,通过使用INTO关键字将值赋给存储过程定义的变量,如:
select SeqID into NewSeqValue from seqt_0101001;
SqlServer
直接通过Select语句查询列中的值,使用“=”将值赋给存储过程中定义的变量,如:select @NewSeqValue=SeqID from SeqT_0101001
4、获取插入表最一个标识值
Mysql
mysql使用last_insert_id()函数向表中插入最后一个标识值
SqlServer
SqlServer中使用scope_identity()函数向表中插入最后一个标识值
5、存储过程中创建表
mysql
在存储过程创建表需要三个步骤完成:1.编写出创建表的sql语句并以字符串的形式赋给变量。
2.使用PREPARE stmt_name from preparable_stmt预定义一个sql语句,并将它赋给stmt_name.
3.使用EXECUTE stmt_name执行预定义的sql语句。
SqlServer
直接在存储过程使用create table语句创建
6、日期转换字符串
MySql
使用date_format(date,format)函数转换,date是日期,now()就是当前日期;format指定要将日期转换成什么样的格式。
format格式:
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%H 小时(00……23)
%k 小时(0……23)
例:date_format(now(),'%y%c'):将日期转换成“YYm”
SqlServer
使用Convert(type,date,format)函数转换,type是要转换成的类型,在这就是varchar/char。date是日期,就是Getdate()当前日期。format是要转换成的字符串格式,可以参数SqlServer官网,http://msdn.microsoft.com/zh-cn/library/ms187928.aspx。例:Convert(char(6),Getdate(),12):这是将当前日期转换成"YYmmDD"格式的字符串。
示例代码:
Mysql示例:
-- 创建表SeqT_0101001
create table seqt_0101001(
-- ID列为自增列
SeqID int auto_increment,
-- Sequence值
SeqVal varchar(1),
primary key (SeqID)
)
delimiter //
create procedure P_GetNewSeqVal_SeqT_0101001 ( out NewSeqVal varchar(14) )
begin
-- 声明新Sequence值变量
declare NewSeqValue int default 0;
declare sqlstr varchar(150);
-- 设置插入、删除操作后的条数显示取消
-- 插入新值到SeqT_0101001表
insert into seqt_0101001 (SeqVal) values('a');
select SeqID into NewSeqValue from seqt_0101001;
if(NewSeqValue % 9 = 0) then
DROP TABLE seqt_0101001;
set sqlstr='create table seqt_0101001(
-- ID列为自增列
SeqID int auto_increment,
-- Sequence值
SeqVal varchar(1),
primary key (SeqID)
)';
PREPARE create_stmt from @sqlstr;
EXECUTE create_stmt;
end if;
-- 设置新Sequence值为插入到SeqT_0101001表的标识列内的最后一个标识值
set NewSeqValue = last_insert_id();
-- 删除SeqT_0101001表(不显示被锁行)
delete from seqt_0101001 ;
set NewSeqVal=CONCAT(date_format(now(),'%y%m'),right(CONCAT('00000',CONCAT(NewSeqValue,'')),5));
end//
SQLServer示例:
create table SeqT_0101001(
-- ID列为自增列
SeqID int identity(1,1) primary key,
-- Sequence值
SeqVal varchar(1)
)
-- 创建从SeqT_0101001表获取最新Sequence值的存储过程
create procedure P_GetNewSeqVal_SeqT_01010012
@NewSeqVal varchar(14) output
as
begin
-- 声明新Sequence值变量
declare @NewSeqValue int
-- 设置插入、删除操作后的条数显示取消
set NOCOUNT ON
-- 插入新值到SeqT_0101001表
insert into SeqT_0101001 (SeqVal) values ('a')
select @NewSeqValue=SeqID from SeqT_0101001
if(@NewSeqValue % 9 = 0)
begin
drop table SeqT_0101001
create table SeqT_0101001(
-- ID列为自增列
SeqID int identity(1,1) primary key,
-- Sequence值
SeqVal varchar(1)
)
end
--print @NewSeqValue
-- 设置新Sequence值为插入到SeqT_0101001表的标识列内的最后一个标识值
set @NewSeqValue = scope_identity()
-- 删除SeqT_0101001表(不显示被锁行)
delete from SeqT_0101001 WITH (READPAST)
set @NewSeqVal=Convert(char(6),Getdate(),12) + right('00000'+CAST(@NewSeqValue AS varchar(5)),5)
--select @NewSeqVal as mySeq
-- 返回新Sequence值
--return @NewSeqVal
end