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

 更新时间:2022年11月28日 09:05:01   作者:AI_Frank  
这篇文章主要介绍了MYSQL与SQLserver之间存储过程的转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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使用IN cone VARCHAR ( 30 )
  • sqlserver使用@cone VARCHAR ( 30 )

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

(2)对于语句的set来说

  • mysql可以直接set 变量
  • sqlserver需要在之前事先声明变量后才可以使用

(3)对于if语句的执行

  • mysql使用if 过程 endif
  • sqlserver使用 if begin 过程 end

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

  • mysql使用prepare stmt from @s; execute stmt;进行预编译和执行
  • sqlserver使用EXEC sp_executesql @s

注意: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 表名称;

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

相关文章

  • MySQL InnoDB如何保证事务特性示例详解

    MySQL InnoDB如何保证事务特性示例详解

    这篇文章主要给大家介绍了关于MySQL InnoDB如何保证事务特性的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • Mysql5.7.14 linux版密码忘记完美解决办法

    Mysql5.7.14 linux版密码忘记完美解决办法

    这篇文章主要介绍了Mysql5.7.14 linux版密码忘记完美解决办法,需要的朋友可以参考下
    2017-08-08
  • 基于SQL中的数据查询语句汇总

    基于SQL中的数据查询语句汇总

    以下是对SQL中的数据查询语句进行了汇总介绍,需要的朋友可以过来参考下
    2013-07-07
  • MySQL ERROR 2013 (HY000)错误解决方法

    MySQL ERROR 2013 (HY000)错误解决方法

    这篇文章主要介绍了MySQL ERROR 2013 (HY000)错误解决方法,错误提示全文ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104,需要的朋友可以参考下
    2015-01-01
  • MySQL timestamp自动更新时间分享

    MySQL timestamp自动更新时间分享

    在mysql中timestamp数据类型是一个比较特殊的数据类型,他可以自动在你不使用程序更新情况下只要你更新了记录timestamp会自动更新时间
    2013-06-06
  • Mysql排序的特性详情

    Mysql排序的特性详情

    这篇文章主要介绍Mysql排序的特性,新写了一个功能,自测和测试环境测试都没问题,但在生产环境会出现偶发问题。于是,加班到12点一直排查问题,终于定位了的问题原因:Mysql Limit查询优化导致。现抽象出问题模型及解决方案,分析给大家,避免大家踩坑,需要的朋友可以参考一下
    2021-10-10
  • mysql创建存储过程及函数详解

    mysql创建存储过程及函数详解

    大家好,本篇文章主要讲的是mysql创建存储过程及函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 详解MySQL 表中非主键列溢出情况监控

    详解MySQL 表中非主键列溢出情况监控

    这篇文章主要介绍了详解MySQL 表中非主键列溢出情况监控,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • MySQL 主主同步配置步骤

    MySQL 主主同步配置步骤

    创建同步用户、修改 /etc/my.cnf 配置文件,为其添加以下内容、分别重启服务器ODD EVEN 上的mysql服务
    2013-05-05
  • mysql日志文件在哪 如何修改MySQL日志文件位置

    mysql日志文件在哪 如何修改MySQL日志文件位置

    MySQL日志文件相信大家都有很多的了解,MySQL日志文件一般在:/var/log/mysqld.log,下面介绍如何修改MySQL日志文件位置,需要的朋友可以参考下
    2012-12-12

最新评论