现在位置: 首页 > 博客文章 > 电脑相关 > IT开发 > 开发语言 > SQL > 正文
MySQL和SQL Server存储过程写法上的区别
2015年03月02日 15:09:53 SQL ⁄ 共 2007字 暂无评论 ⁄ 被围观 2,428次

MySQL 在版本 5.X 之后才有了存储过程,虽然大体上和 SQL Server 差不多,但有些细节的地方,写法上差别还是比较大。如果对存储过程不了解,而且想学学基本知识的朋友,可以看看《MySQL5.x.x存储过程简单入门》,也是最近刚学存储过程时的笔记,非常基础的部分,想入门的朋友可以参考。

由于原来项目有个存储过程是 SQL Server 的,但需要搬到 MySQL 中运行,有些地方需要修改,下面就主要修改的一些地方做一下比较,列出来吧,供大家参考(文章中,MS 代表 MySQL,SS 代表 SQL Server,(a) 代表 @):

1. 在变量的声明和赋值上的差别。

SS 中,变量要先声明后赋值,局部变量用一个(a)标识,全局变量用两个(a)。

SS 声明局部变量语法:

Code   ViewPrint
  1. declare (a)变量名1 数据类型1,(a)变量名2 数据类型2;
  2. declare (a)变量名3 数据类型3,...
  3. 例如:declare (a)method char(10),(a)COUNT INT;
  4. DECLARE (a)starttime DATETIME,...

注意:声明的方式和 MS 有区别,一个 declare 可以声明很多个变量,并用逗号分割,最后用分号,才可以写下一个 declare。另外,变量名前有(a)。

SS 有两种赋值方法((a)num为变量名,value为值):

Code   ViewPrint
  1. set (a)num=value;
  2. select (a)num=value;

SS 如果想获取查询语句中的一个字段的值赋值于某变量,则可以用 select 给变量赋值:
select (a)num=字段名 from 表名 where...

而在 MS 中,变量不用提前声明,当用的时候直接用“(a)变量名”就可以了。但如果想声明,也可以用关键字 declare来先声明。

MS 声明局部变量语法:

Code   ViewPrint
  1. declare 变量名1 数据类型1;declare 变量名2 数据类型2;declare 变量名3 数据类型3;...
  2. 例如:declare method char(10);DECLARE COUNT INT;DECLARE starttime DATETIME;...

注意:声明的写法和 SS 是不同的。没有(a),很多个 declare,每个之间用分号分割。当然也可以不用声明,直接按下面的赋值方式运用变量也行。

MS 赋值局部变量语法:

Code   ViewPrint
  1. set (a)num=1;
  2. set (a)num:=1;
Code   ViewPrint
  1. select (a)num:=1;
  2. select (a)num:=字段名 from 表名 where...

注意:使用 set 时赋值符号可以用“=”或“:=”,而使用 select 时必须用“:=”。

2. IF 判断上的区别。

SS 在用 IF 条件判断语句时,有个 IF 则足够了,看下例:

Code   ViewPrint
  1. if (a)limit_c is null
  2.     select (a)limit_c = 0

但在 MS 中,还需要有 THEN 做连接,并用 END IF 加分号做结尾。

Code   ViewPrint
  1. IF (a)limit_c IS NULL
  2. THEN
  3.  SELECT (a)limit_c := 0;
  4. END IF;

3. 同上,IF ... ELSE ...,IF .. ELSE IF ... ELSE ...。

Code   ViewPrint
  1. SS:
  2. IF ... ELSE ...
  3. IF ... ELSE IF ... ELSE ...(else 和 if 中间有空格)
  4. MS:
  5. IF ... THEN ... ELSE ... END IF;
  6. IF ... THEN ... ELSEIF ... THEN ... ELSE ... END IF;(else 和 if 中间无空格)

4. 动态执行 sql 的命令 EXECUTE 的区别。

Code   ViewPrint
  1. SS:
  2. exec p_getmonthfrist (a)starttime,(a)starttime output
  3. MS:
  4. EXECUTE p_getmonthfrist USING (a)starttime,(a)starttime;

这里只是修改存储过程时碰到的几个不同点,大概整理总结一下,但肯定是九牛一毛,一定还有很多写法大不相同的的地方,只能上网多查查了。

也不知道为啥,代码中有@时,发布博客有下面的警告信息,烦的很。

  1. 由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断。
  2.                站长点击查看详情
  3. 规则ID:1020 拦截时间:2015/03/02 15:05:06
  4. ServerName:chn-tj-ht-sa1/1.2.9-3
  5. 进入站长绿色通道 - 使您的访问不再被拦截

查了下,问题没解决了,就用(a)代替了代码中的@,就凑合看吧。。。

给我留言

留言无头像?