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

目录
  • MYSQL与SQLserver之间存储过程的转换
    • mysql存储过程
    • sqlserver存储过程
  • SQLserver转MYSQL存储过程的经验
    • 1. 存储过程的定义方式存在区别
    • 2. 批处理分隔符存在差异
    • 3. 可直接替换的关键字
    • 4. select语句起别名的方式有区别
    • 5. if语句的结构存在区别
    • 6. cast语句的目标类型存在区别
    • 7. 动态SQL执行语句的书写方式存在区别
    • 8. 调用其它存储过程的方式存在区别
    • 9. 创建临时表的书写方式存在区别

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. 批处理分隔符存在差异

GO delimiter $$

3. 可直接替换的关键字

smalldatetime datetime
money DECIMAL(18,4)
numeric DECIMAL
max 8000
isnull ifnull
getdate now
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 output call p1(hy_v1,hy_v2,@v3 output );

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

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

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

(0)

相关推荐

  • MySQL存储过程参数的用法及说明

    目录 MySQL存储过程的参数 输入参数 输出参数 输入输出参数(INOUT) MySQL存储过程的参数 MySQL存储过程的参数共有三种: IN OUT INOUT 输入参数 输入参数(IN):在调用存储过程中传递数据给存储过程的参数(在调用的存储过程必须具有实际值的变量 或者 字面值) 细节注意:下面的存储过程创建会报错,他的类型以及类型长度需要和创建表字段的类型和类型长度一致 -- 创建一个存储过程:添加一个员工信息 DELIMITER $$ CREATE PROCEDURE proced

  • 分享Sql Server 存储过程使用方法

    目录 一.简介 二.使用 三.在存储过程中实现分页 一.简介 简单记录一下存储过程的使用.存储过程是预编译SQL语句集合,也可以包含一些逻辑语句,而且当第一次调用存储过程时,被调用的存储过程会放在缓存中,当再次执行时,则不需要编译可以立马执行,使得其执行速度会非常快. 二.使用 创建格式    create procedure 过程名( 变量名     变量类型 ) as    begin   ........    end create procedure getGroup(@salary i

  • 详解MySQL中的存储过程和函数

    目录 区别 优点 创建储存函数和过程 储存过程 储存函数 查看储存过程 操作 变量 赋值 变量例子 定义条件和处理过程 条件 处理程序 游标 流程控制语句 储存过程和函数就是数据器将一些处理封装起来,调用 区别 调用储存过程只需要使用CALL,然后指定储存名称和参数,参数可以是IN.OUT和INOUT 调用储存函数只需要使用SELECT,指定名称和参数,储存函数必须有返回值,参数只能是IN 优点 良好的封装性 应用程序和SQL逻辑分离 让SQL也具有处理能力 减少网络交互 能够提高系统性能 降低

  • SQL中创建存储过程

    目录 创建SQL存储过程需要使用到的语法 无参数 带参 两个参数 declare关键字的使用 IF语句 case语句 loop语句 repeat while 创建SQL存储过程需要使用到的语法 - 创建存储过程 CREATE 存储过程的名称(参数)BEGIN...需要执行的SQL语句END - 调用 CALL 存储过程的名称(参数) 个人看法,这就是一个函数... 无参数 CREATE PROCEDURE p_student_select() BEGIN SELECT * FROM studen

  • MySQL中的存储过程异常处理

    目录 1. condition 2.handler 3.diagnostics area 在使用MySQL存储过程时,其中的代码可能会出现运行错误从而导致异常,此时需要将存储过程中产生的异常捕获并打印出来 需要知道的概念: condition hanlder diagnostics area(诊断区) 1. condition 存储过程中出现的错误事件也就是异常都可以被称为condition. declare condition语法: DECLARE condition_name CONDITI

  • MySQL函数与存储过程字符串长度限制的解决

    目录 问题描述 原因分析: 解决方案: 问题描述 MySQL函数或者存储过程中使用group_concat()函数导致数据字符过长而报错 CREATE DEFINER=`root`@`%` PROCEDURE `get_pipe_child`(IN `in_pipe2Num` varchar(25),IN `in_sectionNum` varchar(5)) BEGIN  declare ids varchar(1000) default '';   declare tempids varch

  • java中long(Long)与int(Integer)之间的转换方式

    我就废话不多说了,大家还是直接看代码吧~ public static void main(String[] args) { // 1.将long型转化为int型,其中int.long是基础类型 long a = 10; int b = (int) a; System.out.println("1.将long型转化为int型:" + b); // 2.将int型转化为long型,其中int.long都是基础类型 int a1 = 10; long b1 = a1; System.out.

  • MySQL和SQLServer的比较

    转自: http://www.qqread.com/mysql/z442108305.html 对于程序开发人员而言,目前使用最流行的两种后台数据库即为MySQL和SQLServer.这两者最基本的相似之处在于数据存储和属于查询系统.你可以使用sql来访问这两种数据库的数据,因为它们都支持ansi-sql. 还有,这两种数据库系统都支持二进制关键词和关键索引,这就大大地加快了查询速度.同时,二者也都提供支持xml的各种格式.除了在显而易见的软件价格上的区别之外,这两个产品还有什么明显的区别吗?在

  • 浅谈Mysql、SqlServer、Oracle三大数据库的区别

    一.MySQL 优点: 体积小.速度快.总体拥有成本低,开源: 支持多种操作系统: 是开源数据库,提供的接口支持多种语言连接操作 : MySQL的核心程序采用完全的多线程编程.线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源.用多线程和C语言实现的mysql能很容易充分利用CPU: MySql有一个非常灵活而且安全的权限和口令系统.当客户与MySql服务器连接时,他们之间所有的口令传送被加密,而且MySql支持主机认证: 支持ODBC for Windows, 支持所有的ODB

  • 详解Mysql和Oracle之间的误区

    本质区别 Oracle数据库是一个对象关系数据库管理系统(收费) MySQL是一个开源的关系数据库管理系统(免费) 数据库的安全性 mysql使用三个参数来验证用户,即用户名,密码和位置 Oracle使用了更多的安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等 权限 MySQL的权限系统是通过继承形成的分层结构.权限授于高层时,其他低层隐式继承被授于的权限,当然低层也可改写这些权限. 按授权范围不同,MySQL有以下种授权方式: 1.全局: 2.基于每个主机:

  • Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题

    Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰.你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然). python3.0中怎么创建bytes型数据 bytes([1,2,3,4,5,6,7,8,9]) bytes("python"

  • MySQL自定义函数和存储过程示例详解

    前言 本文主要给大家介绍的是关于MySQL自定义函数和存储过程的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--

  • go语言中int和byte转换方式

    主机字节序 主机字节序模式有两种,大端数据模式和小端数据模式,在网络编程中应注意这两者的区别,以保证数据处理的正确性:例如网络的数据是以大端数据模式进行交互,而我们的主机大多数以小端模式处理,如果不转换,数据会混乱 参考 :一般来说,两个主机在网络通信需要经过如下转换过程:主机字节序 -> 网络字节序 -> 主机字节序 大端小端区别 大端模式:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端 低地址 --------------------> 高地址 高

  • Pandas时间序列:重采样及频率转换方式

    如下所示: import pandas as pd import numpy as np 一.介绍 重采样(resampling)指的是将时间序列从一个频率转换到另一个频率的处理过程: 将高频率(间隔短)数据聚合到低频率(间隔长)称为降采样(downsampling): 将低频率数据转换到高频率则称为升采样(unsampling): 有些采样即不是降采样也不是升采样,例如将W-WED(每周三)转换为W-FRI: 二.resample方法–转换频率的主力函数 rng = pd.date_range

  • Pandas —— resample()重采样和asfreq()频度转换方式

    resample() resample()进行重采样. 重采样(Resampling)指的是把时间序列的频度变为另一个频度的过程.把高频度的数据变为低频度叫做降采样(downsampling),把低频度变为高频度叫做增采样(upsampling). 降采样 考虑因素: 各区间哪边是闭合的(参数:closed) 如何标记各聚合面元,用区间的开头还是末尾(参数:label) In [232]: ts_index = pd.date_range('2018-08-03',periods =12,fre

  • MxNet预训练模型到Pytorch模型的转换方式

    预训练模型在不同深度学习框架中的转换是一种常见的任务.今天刚好DPN预训练模型转换问题,顺手将这个过程记录一下. 核心转换函数如下所示: def convert_from_mxnet(model, checkpoint_prefix, debug=False): _, mxnet_weights, mxnet_aux = mxnet.model.load_checkpoint(checkpoint_prefix, 0) remapped_state = {} for state_key in m

随机推荐