文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MYSQL与SQLserver之间存储过程的转换方式

2022-11-28 09:45

关注

MYSQL与SQLserver之间存储过程的转换

首先先放两个存储过程来进行对比

mysql存储过程

CREATE DEFINER=`root`@`%` PROCEDURE `searchProduct`(
 
 IN cone VARCHAR ( 30 ),
 IN ctow VARCHAR ( 30 ),
 
 IN page INT,
 IN size INT
 )
BEGIN
   set @s='SELECT *  FROM  productclass where status=0';
 
--   if(pname is not null) and pname!=''
--   then set @s=concat(@s,' and product LIKE \'','%',pname,'%','\'');
--   end if;
  if(cone is not null) and cone!=''
  then set @s=concat(@s,' and class1 LIKE \'','%',cone,'%','\'');
  end if;
  if(ctow is not null) and ctow!=''
  then set @s=concat(@s,' and class2 LIKE \'','%',ctow,'%','\'');
  end if;
  
  
  set @s=concat(@s,' ORDER BY class1,class2,class3,class4');
  if(size>0) then
  set @s=concat(@s,' limit ',(page-1)*size,',',size);
  end if;
  -- 拼接完成后可以调用 select @s 语句,查看最终拼接的sql语句是否正确
  prepare stmt from @s;-- 预编译一条sql语句,并命名为stmt
  execute stmt;-- 执行预编译sql
END

sqlserver存储过程

ALTER PROCEDURE [dbo].[searchProduct]
@cone VARCHAR ( 30 ),@ctow VARCHAR ( 30 ),@page INT,@size INT
AS
BEGIN
 -- routine body goes here, e.g.
 -- SELECT 'Navicat for SQL Server'
 declare @s Nvarchar(MAX);
 set @s='SELECT *  FROM  productclass where status=0';
 
--   if(pname is not null) and pname!=''
--   then set @s=concat(@s,' and product LIKE \'','%',pname,'%','\'');
--   end if;
  if(@cone is not null) and @cone!=''
  BEGIN
   set @s=concat(@s,' and class1 LIKE ','''%',@cone,'%''');
  END
  if(@ctow is not null) and @ctow!=''
  BEGIN
   set @s=concat(@s,' and class2 LIKE ','''%',@ctow,'%''');
  END
  
  
  set @s=concat(@s,' ORDER BY class1,class2,class3,class4');
  if(@size>0)
  BEGIN
   set @s=concat(@s,'( select top ',@size,' id from productclass
       where id not in ( 
       select top ', (@page-1)*@size,' id from productclass 
     ))')
  END
  -- 拼接完成后可以调用 select @s 语句,查看最终拼接的sql语句是否正确
  print(@s)
  EXEC sp_executesql @s;
END

综合以上同一功能函数在不同的数据库中的规则不同,总结如下几点区别与相互之间的转换规则:

(1)对于输入参数来说

注意对于参数在下面语句使用中,mysql可以直接使用名称,二sqlserver要加上@符号

(2)对于语句的set来说

(3)对于if语句的执行

(4)对于定义sql语句的执行

注意:sqlserver也可以使用exec(@s),这样的话变量声明一般是varchar类型,若使用sp_executesql必须是Nvarchar的定义类型,具体的区别可以自行百度查询

SQLserver转MYSQL存储过程的经验

总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的,可以使用如下的转换方式。

1. 存储过程的定义方式存在区别

CREATE proc p1
aa int
bb varchar(255) output
as
CREATE PROCEDURE p1(
in aa int,
out bb varchar(255)
) begin
statement_list
end;

2. 批处理分隔符存在差异

GOdelimiter $$

3. 可直接替换的关键字

smalldatetimedatetime
moneyDECIMAL(18,4)
numericDECIMAL
max8000
isnullifnull
getdatenow
dbo.

4、select语句起别名的方式有区别

select 'sunday' day;SELECT 'sunday' AS day;

5. if语句的结构存在区别

if condition
statement
else
statement
if condition then
statement
else
statement
end if;

6. cast语句的目标类型存在区别

目标类型可以是任意类型目标类型可以是以下类型之一:BINARY,CHAR,DATE,DATETIME,TIME,DECIMAL,SIGNED,UNSIGNED

7. 动态SQL执行语句的书写方式存在区别

exec(@sql)PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

8. 调用其它存储过程的方式存在区别

exec p1 @v1,@v2,@v3 outputcall p1(hy_v1,hy_v2,@v3 output );

9. 创建临时表的书写方式存在区别

select 表字段 into #临时表名称
from 正常表
CREATE TEMPORARY TABLE IF NOT EXISTS 临时表名称 AS
SELECT 表字段名称 FROM 表名称;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯